Spring生命周期-BeanFactoryPostProcessor和BeanPostProcessor

Posted OkidoGreen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring生命周期-BeanFactoryPostProcessor和BeanPostProcessor相关的知识,希望对你有一定的参考价值。

BeanFactoryPostProcessor和BeanPostProcessor,这两个接口,都是Spring初始化bean时对外暴露的扩展点。两个接口名称看起来很相似,但作用及使用场景却不同,分析如下:

1、BeanFactoryPostProcessor接口

该接口的定义如下:

[java]  view plain  copy  
  1. public interface BeanFactoryPostProcessor   
  2.   
  3.     /** 
  4.      * Modify the application context's internal bean factory after its standard 
  5.      * initialization. All bean definitions will have been loaded, but no beans 
  6.      * will have been instantiated yet. This allows for overriding or adding 
  7.      * properties even to eager-initializing beans. 
  8.      * @param beanFactory the bean factory used by the application context 
  9.      * @throws org.springframework.beans.BeansException in case of errors 
  10.      */  
  11.     void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;  
  12.   
  13.   
实现该接口,可以在spring的bean创建之前,修改bean的定义属性。也就是说,Spring允许BeanFactoryPostProcessor在容器实例化任何其它bean之前读取配置元数据,并可以根据需要进行修改,例如可以把bean的scope从singleton改为prototype,也可以把property的值给修改掉。可以同时配置多个BeanFactoryPostProcessor,并通过设置'order'属性来控制各个BeanFactoryPostProcessor的执行次序。
注意:BeanFactoryPostProcessor是在spring容器加载了bean的定义文件之后,在bean实例化之前执行的。接口方法的入参是ConfigurrableListableBeanFactory,使用该参数,可以获取到相关bean的定义信息,例子:

1)spring bean的定义:

[html]  view plain  copy  
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
  4.     xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx"  
  5.     xmlns:aop="http://www.springframework.org/schema/aop"  
  6.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  7.                 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd  
  8.                 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"  
  9.     default-autowire="byName">  
  10.       
  11.     <bean id="myJavaBean" class="com.ali.caihj.postprocessor.MyJavaBean">  
  12.         <property name="desc" value="测试一下啦" />  
  13.         <property name="remark" value="这是备注信息啦啦啦" />  
  14.     </bean>  
  15.     <bean id="myBeanFactoryPostProcessor" class="com.ali.caihj.postprocessor.MyBeanFactoryPostProcessor" />  
  16. </beans>  

2)自定义的BeanFactoryPostProcessor:

[java]  view plain  copy  
  1. public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor   
  2.   
  3.     public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException   
  4.         System.out.println("调用MyBeanFactoryPostProcessor的postProcessBeanFactory");  
  5.         BeanDefinition bd = beanFactory.getBeanDefinition("myJavaBean");  
  6.         System.out.println("属性值============" + bd.getPropertyValues().toString());  
  7.         MutablePropertyValues pv =  bd.getPropertyValues();    
  8.         if (pv.contains("remark"))     
  9.             pv.addPropertyValue("remark""把备注信息修改一下");    
  10.             
  11.         bd.setScope(BeanDefinition.SCOPE_PROTOTYPE);  
  12.       
  13.   
  14.   
spring中,有内置的一些BeanFactoryPostProcessor实现类,常用的有:
  • org.springframework.beans.factory.config.PropertyPlaceholderConfigurer
  • org.springframework.beans.factory.config.PropertyOverrideConfigurer
  • org.springframework.beans.factory.config.CustomEditorConfigurer:用来注册自定义的属性编辑器


2、BeanPostProcessor接口

该接口的定义如下:

[java]  view plain  copy  
  1. public interface BeanPostProcessor   
  2.   
  3.     /** 
  4.      * Apply this BeanPostProcessor to the given new bean instance <i>before</i> any bean 
  5.      * initialization callbacks (like InitializingBean's <code>afterPropertiesSet</code> 
  6.      * or a custom init-method). The bean will already be populated with property values. 
  7.      * The returned bean instance may be a wrapper around the original. 
  8.      * @param bean the new bean instance 
  9.      * @param beanName the name of the bean 
  10.      * @return the bean instance to use, either the original or a wrapped one 
  11.      * @throws org.springframework.beans.BeansException in case of errors 
  12.      * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet 
  13.      */  
  14.     Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;  
  15.   
  16.     /** 
  17.      * Apply this BeanPostProcessor to the given new bean instance <i>after</i> any bean 
  18.      * initialization callbacks (like InitializingBean's <code>afterPropertiesSet</code> 
  19.      * or a custom init-method). The bean will already be populated with property values. 
  20.      * The returned bean instance may be a wrapper around the original. 
  21.      * <p>In case of a FactoryBean, this callback will be invoked for both the FactoryBean 
  22.      * instance and the objects created by the FactoryBean (as of Spring 2.0). The 
  23.      * post-processor can decide whether to apply to either the FactoryBean or created 
  24.      * objects or both through corresponding <code>bean instanceof FactoryBean</code> checks. 
  25.      * <p>This callback will also be invoked after a short-circuiting triggered by a 
  26.      * @link InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation method, 
  27.      * in contrast to all other BeanPostProcessor callbacks. 
  28.      * @param bean the new bean instance 
  29.      * @param beanName the name of the bean 
  30.      * @return the bean instance to use, either the original or a wrapped one 
  31.      * @throws org.springframework.beans.BeansException in case of errors 
  32. spring bean的生命周期是怎样的,代码示例

    spring生成bean对象的生命周期都有哪些种类?

    转spring bean的生命周期

    spring中bean的生命周期是怎么样的

    Spring生命周期以及Aop的执行时机总结

    Spring之bean的生命周期