Bean的后置处理器
实现BeanPostProcessor 接口的类是特殊的,容器会对它们进行不同的处理。所有BeanPostProcessor 和他们直接引用的beans都会在容器启动的时候被实例化, 并作为ApplicationContext特殊启动阶段的一部分,紧接着。所有的BeanPostProcessor 都会以一个有序的方式进行注册,并应用于容器中的所有bean。

作用时间点

实例化时、属性赋值时,初始化时
BeanPostProcessor实例在bean(或对象)实例上运行。 即,Spring IoC容器实例化一个bean实例,然后才能用BeanPostProcessor 对这个实例进行处理。
后置处理器都会在容器初始化方法(如InitializingBean.afterPropertiesSet()之前和容器声明的init方法)以及任何bean初始化回调之后被调用。

  1. <!--测试beanPostProcessor 与初始化方法执行顺序-->
  2. <bean id="demoBeanPostProcessor" class="com.masterlu.ioc.high.DemoBeanPostProcessor"
  3. init-method="xmlInit" destroy-method="xmlDestroy"/>
  4. public class DemoBeanPostProcessor implements BeanPostProcessor {
  5. public void xmlInit() {
  6. System.out.println("xmlInit方法执行");
  7. }
  8. public void xmlDestroy() {
  9. System.out.println("xml销毁方法执行");
  10. }
  11. @Override
  12. public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
  13. System.out.println("处理器postProcessBeforeInitialization方法执行");
  14. return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
  15. }
  16. @Override
  17. public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
  18. System.out.println("处理器postProcessAfterInitialization方法执行");
  19. return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
  20. }
  21. }
  22. xmlInit方法执行
  23. 处理器postProcessBeforeInitialization方法执行
  24. 处理器postProcessAfterInitialization方法执行
  25. xml销毁方法执行

注:xml配置初始、销毁方法,最后执行
为同一个bean配置的多个生命周期机制具有不同的初始化方法,如下所示:

  1. 1. 包含@PostConstruct注解的方法
  2. 2. InitializingBean 接口中的afterPropertiesSet() 方法
  3. 3. 自定义的init() 方法

Destroy方法以相同的顺序调用:

  1. 1. 包含@PreDestroy注解的方法
  2. 2. DisposableBean接口中的destroy() 方法
  3. 3. 自定义的destroy() 方法

处理器作用

  1. - Spring容器**完成**实例化,配置和初始化bean**之后**实现某些自定义逻辑,则可以插入**一个或多个**BeanPostProcessor实现(可以通过设置**order属性**来控制BeanPostProcessor 实例的**执行顺序**)
  2. - BeanPostProcessor实例在bean(或对象)实例上运行。 即,Spring IoC容器实例化一个bean实例,然后才能用BeanPostProcessor 对这个实例进行处理。
  3. - BeanPostProcessor在整个容器容器内起作用,每一个BeanProcessor对容器中创建的每一个bean实例起作用。后置处理器可以对bean实例执行任何操作, 包括完全忽略回调

注:
仅当BeanPostProcessor实现 Ordered接口时,才能设置此属性。如果编写自己的BeanPostProcessor,则应考虑实现Ordered接口.

处理器发现过程

private final List beanPostProcessors = new CopyOnWriteArrayList<>();
Spring启动阶段,将所有bean后置处理器,存放在名为beanPostProcessors的List中。

自动检测

ApplicationContext自动地检测所有定义在配置元文件中,并实现了BeanPostProcessor 接口的bean。ApplicationContext会注册这些beans为后置处理器, 使他们可以在bean创建完成之后被调用。bean后置处理器可以像其他bean一样部署到容器中。

编程注册(不推荐)

可以以编程的方式使用ConfigurableBeanFactoryaddBeanPostProcessor方法进行注册。 这对于在注册之前需要对条件逻辑进行评估,或者是在继承层次的上下文之间复制bean的后置处理器中是有很有用的。 但请注意,以编程方式添加的BeanPostProcessor实例不遵循Ordered接口。注册顺序决定了执行的顺序。 另请注意,以编程方式注册的BeanPostProcessor实例始终在通过自动检测注册的实例之前处理,而不管任何显式排序。

常用的BeanPostProcessor实例