我试图理解BeanFactoryPostProcessor
和BeanPostProcessor
之间的区别。
我了解到,BeanFactoryPostProcessor
对bean定义进行操作,即在创建bean实例之前,在实例化bean和调用生命周期事件之后执行bean和BeanPostProcessor
。
这是否意味着BeanFactoryPostProcessor
不是在实例化之前调用的spring生命周期事件的一部分,而BeanPostProcessor
是Spring生命周期事件的一部分?请确认我的理解是否正确。
发布于 2015-05-26 10:40:24
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
}
}
}
BeanFactoryPostProcessor
与BeanPostProcessor
的区别
BeanFactoryPostProcessor
的bean。这允许覆盖或添加属性,即使是对急切初始化bean。这将允许您访问在XML中定义的所有bean或注释的bean(通过组件扫描扫描)。BeanPostProcessor
的bean对bean (或对象)实例进行操作,这意味着当Spring容器实例化bean实例时,BeanPostProcessor接口将完成它们的工作。BeanFactoryPostProcessor
实现在Spring上下文启动期间被“调用”,而当Spring IoC容器实例化bean时(即在启动所有单个实例和按需要对proptotypes 1进行请求时),BeanPostProcessor
被“调用”发布于 2019-02-21 12:24:55
这里有一个流程图,它可能有助于理解spring初始化生命周期。
正如我们所看到的,theBeanFactoryPostProcessor的实现是在任何spring实例化之前执行的,这与BeanPostprocessor相反,后者只在实例化bean时才执行已实现的方法。
源图像来自Spring5DesignPatterns图书。
我从这本书中挑选出这样的解释:
在从所有配置样式加载bean定义之后,BeanFactoryPostProcessor进入图片以修改某些bean的定义,然后容器实例化bean。最后,BeanPostProcessor在bean上工作,它可以修改和更改bean对象。这是初始化阶段。
发布于 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之前和之后)。一旦味道好了,食物就准备好了(豆子就可以用了)。
https://stackoverflow.com/questions/30455536
复制相似问题