一尘不染

生命周期事件中的BeanFactoryPostProcessor和BeanPostProcessor

spring

我试图理解之间的差异BeanFactoryPostProcessorBeanPostProcessor

我知道可以BeanFactoryPostProcessor对bean进行定义,即在创建bean实例之前先执行它,然后BeanPostProcessor在实例化bean和调用生命周期事件之后再执行它。

BeanFactoryPostProcessor是不是在实例化之前就称为BeanPostProcessorSpring生命周期事件的一部分,而不是Spring生命周期事件的一部分?请验证我的理解是否正确。


阅读 726

收藏
2020-04-17

共1个答案

一尘不染

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. BeanFactoryPostProcessor当所有bean定义都将被加载但尚未实例化任何bean时,将调用bean实现。这甚至可以覆盖或添加属性,甚至可以用于初始化bean。这将使你可以访问以XML定义或已注释(通过component-scan扫描)的所有bean。
  2. Bean实现BeanPostProcessor对Bean(或对象)实例进行操作,这意味着当Spring IoC容器实例化Bean实例时,BeanPostProcessor接口将完成其工作。
  3. BeanFactoryPostProcessor在所有上下文定义都将被加载之后,在Spring上下文启动期间“实现” BeanPostProcessor被“调用”,而在Spring IoC容器实例化一个bean时(即在所有单例启动时以及根据原型的需求启动时)“调用”实现。
2020-04-17