Bean的后置处理器
实现BeanPostProcessor 接口的类是特殊的,容器会对它们进行不同的处理。所有BeanPostProcessor 和他们直接引用的beans都会在容器启动的时候被实例化, 并作为ApplicationContext特殊启动阶段的一部分,紧接着。所有的BeanPostProcessor 都会以一个有序的方式进行注册,并应用于容器中的所有bean。
作用时间点
实例化时、属性赋值时,初始化时BeanPostProcessor实例在bean(或对象)实例上运行。 即,Spring IoC容器实例化一个bean实例,然后才能用BeanPostProcessor 对这个实例进行处理。
后置处理器都会在容器初始化方法(如InitializingBean.afterPropertiesSet()之前和容器声明的init方法)以及任何bean初始化回调之后被调用。
<!--测试beanPostProcessor 与初始化方法执行顺序--><bean id="demoBeanPostProcessor" class="com.masterlu.ioc.high.DemoBeanPostProcessor"init-method="xmlInit" destroy-method="xmlDestroy"/>public class DemoBeanPostProcessor implements BeanPostProcessor {public void xmlInit() {System.out.println("xmlInit方法执行");}public void xmlDestroy() {System.out.println("xml销毁方法执行");}@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("处理器postProcessBeforeInitialization方法执行");return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("处理器postProcessAfterInitialization方法执行");return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);}}xmlInit方法执行处理器postProcessBeforeInitialization方法执行处理器postProcessAfterInitialization方法执行xml销毁方法执行
注:xml配置初始、销毁方法,最后执行
为同一个bean配置的多个生命周期机制具有不同的初始化方法,如下所示:
1. 包含@PostConstruct注解的方法2. 在InitializingBean 接口中的afterPropertiesSet() 方法3. 自定义的init() 方法
Destroy方法以相同的顺序调用:
1. 包含@PreDestroy注解的方法2. 在DisposableBean接口中的destroy() 方法3. 自定义的destroy() 方法
处理器作用
- Spring容器**完成**实例化,配置和初始化bean**之后**实现某些自定义逻辑,则可以插入**一个或多个**BeanPostProcessor实现(可以通过设置**order属性**来控制BeanPostProcessor 实例的**执行顺序**)- BeanPostProcessor实例在bean(或对象)实例上运行。 即,Spring IoC容器实例化一个bean实例,然后才能用BeanPostProcessor 对这个实例进行处理。- BeanPostProcessor在整个容器容器内起作用,每一个BeanProcessor对容器中创建的每一个bean实例起作用。后置处理器可以对bean实例执行任何操作, 包括完全忽略回调
注:
仅当BeanPostProcessor实现 Ordered接口时,才能设置此属性。如果编写自己的BeanPostProcessor,则应考虑实现Ordered接口.
处理器发现过程
private final List
Spring启动阶段,将所有bean后置处理器,存放在名为beanPostProcessors的List中。
自动检测
ApplicationContext会自动地检测所有定义在配置元文件中,并实现了BeanPostProcessor 接口的bean。ApplicationContext会注册这些beans为后置处理器, 使他们可以在bean创建完成之后被调用。bean后置处理器可以像其他bean一样部署到容器中。
编程注册(不推荐)
可以以编程的方式使用ConfigurableBeanFactory的addBeanPostProcessor方法进行注册。 这对于在注册之前需要对条件逻辑进行评估,或者是在继承层次的上下文之间复制bean的后置处理器中是有很有用的。 但请注意,以编程方式添加的BeanPostProcessor实例不遵循Ordered接口。注册顺序决定了执行的顺序。 另请注意,以编程方式注册的BeanPostProcessor实例始终在通过自动检测注册的实例之前处理,而不管任何显式排序。
