BeanPostProcessor扩展点分析
BeanPostProcess接口是在Bean完成实例化后,如果我们要对所有的加载bean进行一些处理或增加配置的接口
- BeanPostProcessor.java
BeanPostProcessor{
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException
}
- 执行结果
可以看出BeanPostprocessor会对每一个bean在初始化前后进行处理
处理机制
在完成属性装配之后执行initializeBean方法
注意在这里的getBeanPostProcessors()并没有选择某些特定的BeanPostProcessor来执行;
在装配属性的populateBean方法中会指定执行接口,如下所示:
BeanPostProcessor加载时机
在AbstractApplicationContext刷新容器的过程中会执行registerBeanPostProcessors方法.这个方法的目的就是将BeanPostProcessors子类注册到BeanFactory中,其中还会实现priority、order等功能进行排序
8WSfMj.png
常用的BeanPostProcessor子类
类名 | 作用 |
---|---|
InstantiationAwareBeanPostProcessorAdapter | 实例化后进行初始化前后执行(可以对属性的装配进行控制) |
ServletContextAwareProcessor | 对servletContext进行处理 |
ApplicationContextAwareProcessor | 对容器工具类进行赋值操作,以便后续进行使用(例如注入环境变量这些) |
总结
- BeanPostProcessor 的作用域是容器级别的,它只和所在的容器相关 ,当 BeanPostProcessor 完成注册后,它会应用于所有跟它在同一个容器内的 bean 。
- BeanFactory 和 ApplicationContext 对 BeanPostProcessor 的处理不同,ApplicationContext 会自动检测所有实现了 BeanPostProcessor 接口的 bean,并完成注册,但是使用 BeanFactory 容器时则需要手动调用 AbstractBeanFactory#addBeanPostProcessor(BeanPostProcessor beanPostProcessor) 方法来完成注册
- ApplicationContext 的 BeanPostProcessor 支持 Ordered,而 BeanFactory 的 BeanPostProcessor 是不支持的,原因在于ApplicationContext 会对 BeanPostProcessor 进行 Ordered 检测并完成排序,而 BeanFactory 中的 BeanPostProcessor 只跟注册的顺序有关。