BeanFactoryPostProcessor
Spring 初始化 bean 时对外暴露的扩展点,一般叫做 Spring 的 Bean 后置处理接口。
BeanFactoryPostProcessor 在实例化之前被调用,而 BeanPostProcessor 则是在实例化过程中使用。
BeanFactoryPostProcessor
实现该接口,可以在 Spring 创建 bean 之前修改 bean 的定义属性。就是说,Spring 允许 BeanFactoryPostProcessor 在容器实例化 bean 之前读取配置元数据,并可以根据需要进行修改。例如:可以把 bean 的 Scope 从 singleton 改为 property。另外可以配置多个 BeanFactoryPostProcessor,并通过 order 属性来控制 BeanFactoryPostProcessor 的执行顺序(在实现 BeanFactoryPostProcessor 时应该考虑实现 Ordered 接口)。
BeanFactoryPostProcessor 是在 Spring 容器加载了定义 bean 的 XML 文件之后,在 bean 实例化之前执行的。接口方法入参是 ConfigurrableListableBeanFactory 类型,使用该参数可以获取到相关的 bean 的定义信息。
实际应用
XML 文件配置
XML 文件配置中存在变量,user.name ,或者 jdbc.url 等配置,其中替换该字符串则是通过 ProperyPlaceholderConfigurer 替换的。
PropertyPlaceholderConfigurer 间接继承了 BeanFactoryPostProcessor 接口,当 Spring 加载任何实现了该接口的 bean 配置时,都会在 bean 工厂载入所有 bean 的配置之后执行 postProcessBeanFactory,该方法中先后调用了 mergeProperties、convertProperties、processProperties 这三个方法,先得到配置,将得到的配置转换为合适的类型,最后将配置内容告知 BeanFactory。通过实现 Ordered 接口,重写 getOrder() 方法,可以实现其实现的先后顺序。
BeanPostProcessor
BeanPostProcessor 可以在 spring容器实例化 bean 之后,在执行 bean 的初始化方法前后,添加一些自己的处理逻辑。
- bean 实现了 IntializingBean 接口,对应方法为 afterPropertiesSet
- 在 XML 文件中定义 bean 的时候,标签属性 init-method 来指定初始化方法
*BeanPostProcessor 是在 spring 容器加载了 bean 的定义文件并且实例化 bean 之后执行的。BeanPostProcessor 的执行顺序是在 BeanFactoryPostProcessor 之后。
总结
BeanFactoryPostProcessor 和 BeanPostProcessor 都是服务于 bean 的生命周期中的。BeanFactoryPostProcessor 作用于 bean 实例化之前,读取配置元数据,并且可以修改;而 BeanPostProcessor 作用于 bean 的实例化过程中,然后可以改变 bean 实例。