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销毁方法执行");
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("处理器postProcessBeforeInitialization方法执行");
return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
}
@Override
public 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
实例始终在通过自动检测注册的实例之前处理,而不管任何显式排序。