有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

生命周期事件中的java BeanFactory后处理器和BeanPostProcessor

我试图理解BeanFactoryPostProcessorBeanPostProcessor之间的区别

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

这是否意味着BeanFactoryPostProcessor不是spring生命周期事件的一部分,而BeanPostProcessor是spring生命周期事件的一部分?请核实我的理解是否正确


共 (4) 个答案

  1. # 1 楼答案

    豆厂后处理(BFPP):

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

    Bean后处理器(BPP):

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

    实时示例:

    您想从Zomato在线订购食品。在线订购时,您会向餐厅提供食物列表(XML/注释)。但是,就在餐厅开始制作食物之前,你给他们打电话,让他们换菜(BFPP)。现在食物已经准备好交付,您已经收到了它(豆子被创建)。但是你想做一些修改(比如盐或冷粉),你可以在品尝食物之前做(因为你知道餐馆从来没有放足够的盐),甚至在品尝食物之后(这是在@postconstruct之前和之后)。一旦味道好了,食物就准备好了(豆子就可以使用了)

  2. # 2 楼答案

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

    BeanPostprocessor在创建bean对象之后执行,因为它可以在init()之前和之后执行

  3. # 3 楼答案

    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定义都已加载,但尚未实例化任何bean时,将调用实现BeanFactoryPostProcessor的bean。这允许重写或添加属性,甚至可以初始化bean。这将使您能够访问在XML中定义的所有bean或带注释的bean(通过组件扫描进行扫描)
    2. 实现BeanPostProcessor的bean对bean(或对象)实例进行操作,这意味着当SpringIoC容器实例化bean实例时,BeanPostProcessor接口将完成它们的工作
    3. BeanFactoryPostProcessor实现在所有bean定义加载后的Spring上下文启动期间被“调用”,而BeanPostProcessor实现在Spring IoC容器实例化bean时被“调用”(即,在所有单例启动期间以及根据需要对proptotypes进行调用)
  4. # 4 楼答案

    下面是一个流程图,它可能有助于理解Springbean的初始化生命周期

    enter image description here

    如我们所见,BeanFactoryPostProcessor的实现在任何SpringBean实例化之前执行,与BeanPostprocessor相反,BeanFactoryPostProcessor的实现方法仅在实例化bean时执行

    源图像来自Spring5设计模式手册

    我从书中选择了解释:

    After loading the bean definitions from all styles of configurations, BeanFactoryPostProcessor comes into the picture to modify the definition of some beans, and then the container instantiates the beans. Finally, BeanPostProcessor works on the beans, and it can modify and change the bean object. This is the initialization phase.