BeanFactoryPostProcessor和BeanPostProcessor

BeanFactoryPostProcessor和BeanPostProcessor是spring容器对外暴露的扩展接口,它们在作用和使用场景还是有一定的区别。

 

1.BeanFactoryPostProcessor

BeanFactoryPostProcessor定义如下:

public interface BeanFactoryPostProcessor {
    void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}

实现BeanFactoryPostProcessor接口的类,在spring初始化bean之前,可以修改bean的定义。Spring允许BeanFactoryPostProcessor在容器实例化任何其它bean之前读取配置元数据,并可以根据需要进行修改,例如可以把bean的scope从singleton改为prototype,也可以把property的值给修改掉。spring会自动检测配置中的BeanFactoryPostProcessor,在初始化的时候执行。
注意:BeanFactoryPostProcessor是在spring容器加载了bean的定义文件之后,在bean实例化之前执行的。接口方法的入参是ConfigurrableListableBeanFactory,使用该参数,可以获取到相关bean的定义信息。

例子:

public class MyFactoryPostProcessor implements BeanFactoryPostProcessor {  
  
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {  
        System.out.println("调用MyFactoryPostProcessor的postProcessBeanFactory");  
        BeanDefinition bd = beanFactory.getBeanDefinition("personBean");  
        System.out.println("属性值============" + bd.getPropertyValues().toString());  
        MutablePropertyValues pv =  bd.getPropertyValues();    
        if (pv.contains("name")) {    
            pv.addPropertyValue("name", "小王");    
        }    
    }  
  
} 

配置:

<bean id="personBean" class="com.spring.test.postprocessor.PersonBean">  
        <property name="name" value="小张" />   
    </bean>  
<bean id="myFactoryPostProcessor" class="com.spring.test.postprocessor.MyFactoryPostProcessor" /> 

 

2.BeanPostProcessor

BeanPostProcessor结构:

public interface BeanPostProcessor {

    //在bean实例化之后,InitializingBean.afterPropertiesSet 和 init-method 之前
    Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;

    //在bean实例化之后,InitializingBean.afterPropertiesSet 和 init-method 之后
    Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}

BeanPostProcessor是一个工厂钩子,允许自定义修改新的bean实例,如检查标记接口或包装代理。

ApplicationContext可以自动检测BeanPostProcessor bean的bean定义并将它们应用于随后创建的任何bean。BeanPostProcessor在执行bean的初始化方法前后,添加一些自己的处理逻辑。这里说的初始化方法,指的是下面两种:

1)bean实现了InitializingBean接口,对应的方法为afterPropertiesSet()

2)在bean定义的时候,通过init-method设置的方法

注意:BeanPostProcessor是在spring容器加载了bean的定义文件并且实例化bean之后执行的。BeanPostProcessor的执行顺序是在BeanFactoryPostProcessor之后。

 

转载于:https://my.oschina.net/jayhu/blog/918091

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值