首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >生命周期事件中的BeanFactoryPostProcessor和BeanPostProcessor

生命周期事件中的BeanFactoryPostProcessor和BeanPostProcessor
EN

Stack Overflow用户
提问于 2015-05-26 10:10:10
回答 4查看 31.6K关注 0票数 41

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

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-05-26 10:40:24

BeanFactoryPostProcessor是一个接口,实现它的bean实际上是经过Spring生命周期(例如下面的例子)的bean,但是这些bean并不是其他声明的bean生命周期的一部分。

代码语言:javascript
运行
复制
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 (或对象)实例进行操作,这意味着当Spring容器实例化bean实例时,BeanPostProcessor接口将完成它们的工作。
  3. 在启动所有bean定义之后,BeanFactoryPostProcessor实现在Spring上下文启动期间被“调用”,而当Spring IoC容器实例化bean时(即在启动所有单个实例和按需要对proptotypes 1进行请求时),BeanPostProcessor被“调用”
票数 71
EN

Stack Overflow用户

发布于 2019-02-21 12:24:55

这里有一个流程图,它可能有助于理解spring初始化生命周期。

正如我们所看到的,theBeanFactoryPostProcessor的实现是在任何spring实例化之前执行的,这与BeanPostprocessor相反,后者只在实例化bean时才执行已实现的方法。

源图像来自Spring5DesignPatterns图书。

我从这本书中挑选出这样的解释:

在从所有配置样式加载bean定义之后,BeanFactoryPostProcessor进入图片以修改某些bean的定义,然后容器实例化bean。最后,BeanPostProcessor在bean上工作,它可以修改和更改bean对象。这是初始化阶段。

票数 39
EN

Stack Overflow用户

发布于 2020-03-30 20:10:04

豆厂后处理(BFPP):

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

Bean后处理器(BPP):

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

实时示例:

你想从佐马托网上订购食物。在网上订餐时,你会给餐厅一个食物列表(XML/注释)。但是,就在餐厅开始做菜之前,你给他们打电话,让他们换菜(BFPP)。现在食物准备好了,你已经收到了(Bean被创建了)。但是你想要做一些修改(比如盐或冷粉),你可以在品尝食物之前这样做(因为你知道餐馆从来不放足够的盐),甚至在品尝食物之后(这是在@postconstruct之前和之后)。一旦味道好了,食物就准备好了(豆子就可以用了)。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30455536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档