我试图了解BeanFactoryPostProcessor
和BeanPostProcessor
之间的区别。
我理解BeanFactoryPostProcessor
对bean定义进行操作,即在创建bean实例之前,它会被执行,并且在实例化bean并调用生命周期事件之后执行BeanPostProcessor
。
这是否意味着BeanFactoryPostProcessor
不是Spring生命周期事件的一部分,因为它是在实例化之前调用的,而BeanPostProcessor
是Spring生命周期事件的一部分?请核实我的理解是否正确。
答案 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
}
}
}
关于BeanFactoryPostProcessor
和BeanPostProcessor
的差异:
BeanFactoryPostProcessor
的bean,但尚未实例化bean。这允许覆盖或添加属性,甚至是初始化bean。这样您就可以访问已在XML中定义的所有bean或带注释的bean(通过组件扫描进行扫描)。BeanPostProcessor
的bean对bean(或对象)实例进行操作,这意味着当Spring IoC容器实例化bean实例时,BeanPostProcessor接口会完成它们的工作。BeanFactoryPostProcessor
实施是"称为"在启动所有bean定义之后启动Spring上下文时,BeanPostProcessor
被称为#34;当Spring IoC容器实例化一个bean时(即在所有单例的启动期间以及根据需要对一个bean进行实例化)答案 1 :(得分:2)
BeanFactoryPostProcessor
在bean Object
实例化之前执行(即在初始化Applicationcontext
容器时)
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)