生命周期事件中的BeanFactoryPostProcessor和BeanPostProcessor

时间:2015-05-26 10:10:11

标签: java spring

我试图了解BeanFactoryPostProcessorBeanPostProcessor之间的区别。

我理解BeanFactoryPostProcessor对bean定义进行操作,即在创建bean实例之前,它会被执行,并且在实例化bean并调用生命周期事件之后执行BeanPostProcessor

这是否意味着BeanFactoryPostProcessor不是Spring生命周期事件的一部分,因为它是在实例化之前调用的,而BeanPostProcessor是Spring生命周期事件的一部分?请核实我的理解是否正确。

4 个答案:

答案 0 :(得分:35)

BeanFactoryPostProcessor是一个接口,实现它的bean实际上是经历Spring生命周期的bean(下面的示例),但是这些bean不会参与其他声明的bean'的生命周期。

public class CustomBeanFactory implements BeanFactoryPostProcessor {

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        for (String beanName : beanFactory.getBeanDefinitionNames()) {

            BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName);

            // Manipulate the beanDefiniton or whatever you need to do

        }
    }
}

关于BeanFactoryPostProcessorBeanPostProcessor的差异:

  1. 在加载所有bean定义时调用实现BeanFactoryPostProcessor的bean,但尚未实例化bean。这允许覆盖或添加属性,甚至是初始化bean。这样您就可以访问已在XML中定义的所有bean或带注释的bean(通过组件扫描进行扫描)。
  2. 实现BeanPostProcessor的bean对bean(或对象)实例进行操作,这意味着当Spring IoC容器实例化bean实例时,BeanPostProcessor接口会完成它们的工作。
  3. BeanFactoryPostProcessor实施是"称为"在启动所有bean定义之后启动Spring上下文时,BeanPostProcessor被称为#34;当Spring IoC容器实例化一个bean时(即在所有单例的启动期间以及根据需要对一个bean进行实例化)

答案 1 :(得分:2)

BeanFactoryPostProcessor在bean Object实例化之前执行(即在初始化Applicationcontext容器时)

创建bean对象后执行

BeanPostprocessor,因为它可以在init()之前和init()之后执行。

答案 2 :(得分:2)

Bean工厂后期处理程序(BFPP):

在我们想覆盖XML /注解时使用,因为Spring读取XML /注解以创建bean。如果要在创建过程中(运行时)为Spring提供不同的配置,则需要使用BFPP。创建内部依赖关系图是一个一次性的过程。

Bean Post Processor(BPP):

以上步骤仅发生一次。这就像创建bean的“菜单”。创建bean之后,如果要更改bean属性,则不能对XML /批注进行任何更改。相反,您可以在创建后使用BPP进行Bean配置更改。 BPP有两个执行区域,一个在@postconstruct之前,另一个在@postconstruct之后。

实时示例:

您想从Zomato下订单。在线订购时,您可以向餐厅提供食物清单(XML /注释)。但是,就在餐厅开始做饭之前,您打电话给他们,要求他们改变菜式(BFPP)。现在可以准备运送食物了,您已经收到了(创建了Bean)。但是您想进行一些修改(例如盐或冷粉),并且可以在品尝食物之前进行此操作(因为您知道餐馆从来没有放足够的盐),甚至可以在品尝食物之后进行此操作(这在@postconstruct之前和之后) 。一旦味道很好,就可以准备食物了(咖啡豆可以使用了。)

答案 3 :(得分:1)

这是一个流程图,可以帮助您了解Spring bean初始化生命周期。

enter image description here

我们可以看到,BeanFactoryPostProcessor的实现是在任何弹簧bean实例化之前执行的,这与BeanPostprocessor相反,后者仅在实例化bean时才执行实现的方法。

源图像来自Spring 5设计模式手册。

我从书中选择了解释:

  

从所有样式的配置中加载bean定义后,   BeanFactoryPostProcessor进入图片修改   定义一些bean,然后容器实例化   豆子。最后,BeanPostProcessor可在Bean上运行,并且可以   修改和更改bean对象。这是初始化阶段。