BeanFactoryPostProcessor
    Spring 初始化 bean 时对外暴露的扩展点,一般叫做 Spring 的 Bean 后置处理接口。
    BeanFactoryPostProcessor/BeanPostProcessor - 图1

    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 替换的。BeanFactoryPostProcessor/BeanPostProcessor - 图2
    PropertyPlaceholderConfigurer 间接继承了 BeanFactoryPostProcessor 接口,当 Spring 加载任何实现了该接口的 bean 配置时,都会在 bean 工厂载入所有 bean 的配置之后执行 postProcessBeanFactory,该方法中先后调用了 mergeProperties、convertProperties、processProperties 这三个方法,先得到配置,将得到的配置转换为合适的类型,最后将配置内容告知 BeanFactory。通过实现 Ordered 接口,重写 getOrder() 方法,可以实现其实现的先后顺序。

    BeanPostProcessor
    BeanPostProcessor 可以在 spring容器实例化 bean 之后,在执行 bean 的初始化方法前后,添加一些自己的处理逻辑。

    1. bean 实现了 IntializingBean 接口,对应方法为 afterPropertiesSet
    2. 在 XML 文件中定义 bean 的时候,标签属性 init-method 来指定初始化方法

    *BeanPostProcessor 是在 spring 容器加载了 bean 的定义文件并且实例化 bean 之后执行的。BeanPostProcessor 的执行顺序是在 BeanFactoryPostProcessor 之后。
    总结
    BeanFactoryPostProcessor 和 BeanPostProcessor 都是服务于 bean 的生命周期中的。BeanFactoryPostProcessor 作用于 bean 实例化之前,读取配置元数据,并且可以修改;而 BeanPostProcessor 作用于 bean 的实例化过程中,然后可以改变 bean 实例。