Spring的BeanFactoryPostProcessor和BeanPostProcessor接口的区别

BeanFactoryPostProcessor接口

public interface BeanFactoryPostProcessor {  

    /** 
     * Modify the application context's internal bean factory after its standard 
     * initialization. All bean definitions will have been loaded, but no beans 
     * will have been instantiated yet. This allows for overriding or adding 
     * properties even to eager-initializing beans. 
     * @param beanFactory the bean factory used by the application context 
     * @throws org.springframework.beans.BeansException in case of errors 
     */  
    void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;  

}  

实现该接口,可以在spring的bean创建之前,修改bean的定义属性。
注意:BeanFactoryPostProcessor是在spring容器加载了bean的定义文件之后,在bean实例化之前执行的。接口方法的入参是ConfigurrableListableBeanFactory,使用该参数,可以获取到相关bean的定义信息,例子:

    <bean id="myJavaBean" class="com.ali.caihj.postprocessor.MyJavaBean">  
        <property name="desc" value="测试一下啦" />  
        <property name="remark" value="这是备注信息啦啦啦" />  
    </bean>  
    <bean id="myBeanFactoryPostProcessor" class="com.ali.caihj.postprocessor.MyBeanFactoryPostProcessor" />  

MyBeanFactoryPostProcessor 实现 BeanFactoryPostProcessor :

public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {  

    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {  
        // 根据beanid获取定义好的bean
        BeanDefinition bd = beanFactory.getBeanDefinition("myJavaBean");  
        // 根据bean获取属性集合
        MutablePropertyValues pv =  bd.getPropertyValues();    
        if (pv.contains("remark")) {    
            pv.addPropertyValue("remark", "把备注信息修改一下");    
        }    
        bd.setScope(BeanDefinition.SCOPE_PROTOTYPE);  
    }  

}  

BeanPostProcessor接口

public interface BeanPostProcessor {  

    /** 
     * Apply this BeanPostProcessor to the given new bean instance <i>before</i> any bean 
     * initialization callbacks (like InitializingBean's <code>afterPropertiesSet</code> 
     * or a custom init-method). The bean will already be populated with property values. 
     * The returned bean instance may be a wrapper around the original. 
     * @param bean the new bean instance 
     * @param beanName the name of the bean 
     * @return the bean instance to use, either the original or a wrapped one 
     * @throws org.springframework.beans.BeansException in case of errors 
     * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet 
     */  
    Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;  

    /** 
     * Apply this BeanPostProcessor to the given new bean instance <i>after</i> any bean 
     * initialization callbacks (like InitializingBean's <code>afterPropertiesSet</code> 
     * or a custom init-method). The bean will already be populated with property values. 
     * The returned bean instance may be a wrapper around the original. 
     * <p>In case of a FactoryBean, this callback will be invoked for both the FactoryBean 
     * instance and the objects created by the FactoryBean (as of Spring 2.0). The 
     * post-processor can decide whether to apply to either the FactoryBean or created 
     * objects or both through corresponding <code>bean instanceof FactoryBean</code> checks. 
     * <p>This callback will also be invoked after a short-circuiting triggered by a 
     * {@link InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation} method, 
     * in contrast to all other BeanPostProcessor callbacks. 
     * @param bean the new bean instance 
     * @param beanName the name of the bean 
     * @return the bean instance to use, either the original or a wrapped one 
     * @throws org.springframework.beans.BeansException in case of errors 
     * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet 
     * @see org.springframework.beans.factory.FactoryBean 
     */  
    Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;  

}  

BeanPostProcessor,可以在spring容器实例化bean之后,在执行bean的初始化方法前后,添加一些自己的处理逻辑。这里说的初始化方法,指的是下面两种:
1)bean实现了InitializingBean接口,对应的方法为afterPropertiesSet
2)在bean定义的时候,通过init-method设置的方法
注意:BeanPostProcessor是在spring容器加载了bean的定义文件并且实例化bean之后执行的。BeanPostProcessor的执行顺序是在BeanFactoryPostProcessor之后。

代码接上:

public class MyBeanPostProcessor implements BeanPostProcessor {  

    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {  
        // bean对象实例化前执行的操作
        return bean;  
    }  
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {  
        // bean对象实例化执行的操作
        return bean;  
    }  
}  

总结

BeanFactoryPostProcessor在bean实例化之前执行,之后实例化bean(调用构造函数,并调用set方法注入属性值),然后在调用两个初始化方法前后,执行了BeanPostProcessor。

这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值