BeanPostProcessor扩展点分析


BeanPostProcessor扩展点分析

BeanPostProcess接口是在Bean完成实例化后,如果我们要对所有的加载bean进行一些处理或增加配置的接口

  • BeanPostProcessor.java
BeanPostProcessor{
    Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
    Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException
}
  • 执行结果

8RTugf.png

可以看出BeanPostprocessor会对每一个bean在初始化前后进行处理

处理机制

8RvFDx.png

在完成属性装配之后执行initializeBean方法

8RvtPg.md.png

注意在这里的getBeanPostProcessors()并没有选择某些特定的BeanPostProcessor来执行;
在装配属性的
populateBean
方法中会指定执行接口,如下所示:
8RzUun.png

BeanPostProcessor加载时机

AbstractApplicationContext刷新容器的过程中会执行registerBeanPostProcessors方法.这个方法的目的就是将BeanPostProcessors子类注册到BeanFactory中,其中还会实现priorityorder等功能进行排序
8WSfMj.png

常用的BeanPostProcessor子类

类名 作用
InstantiationAwareBeanPostProcessorAdapter 实例化后进行初始化前后执行(可以对属性的装配进行控制)
ServletContextAwareProcessor 对servletContext进行处理
ApplicationContextAwareProcessor 对容器工具类进行赋值操作,以便后续进行使用(例如注入环境变量这些)

总结

  1. BeanPostProcessor 的作用域是容器级别的,它只和所在的容器相关 ,当 BeanPostProcessor 完成注册后,它会应用于所有跟它在同一个容器内的 bean 。
  2. BeanFactoryApplicationContextBeanPostProcessor 的处理不同,ApplicationContext 会自动检测所有实现了 BeanPostProcessor 接口的 bean,并完成注册,但是使用 BeanFactory 容器时则需要手动调用 AbstractBeanFactory#addBeanPostProcessor(BeanPostProcessor beanPostProcessor) 方法来完成注册
  3. ApplicationContextBeanPostProcessor 支持 Ordered,而 BeanFactory 的 BeanPostProcessor 是不支持的,原因在于ApplicationContext 会对 BeanPostProcessor 进行 Ordered 检测并完成排序,而 BeanFactory 中的 BeanPostProcessor 只跟注册的顺序有关。

  TOC