1、BeanFactoryPostProcessor是一個接口,它允許自定義修改應用程序上下文的bean定義,在基於bean factory上調整上下文的bean屬性值。BeanFactoryPostProcessor可以與bean交互並修改bean定義,但從不使用bean實例。
該接口有一個方法:void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
該方法可以在應用程序上下文初始化之后修改bean factory。所有的bean定義都已經被加載了,但是還沒有實例化bean,這樣就可以覆蓋或添加屬性。
實例:注入實現接口BeanFactoryPostProcessor的bean

源碼debug圖解
(1)、

(2)、

(3)、

(4)、

(5)、

(6)、

2、BeanDefinitionRegistryPostProcessor接口繼承接口BeanFactoryPostProcessor,該接口新增postProcessBeanDefinitionRegistry方法,方法參數是BeanDefinitionRegistry對象,BeanDefinitionRegistry對象是bean定義的保存中心
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException

實例:注入實現接口BeanFactoryPostProcessor的bean
@Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
System.out.println("MyBeanDefinitionRegistryPostProcessor : postProcessBeanDefinitionRegistry");
System.out.println(registry.getBeanDefinitionCount());
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(AddedBean.class);
registry.registerBeanDefinition("myaddBeanDefinition",rootBeanDefinition);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("MyBeanDefinitionRegistryPostProcessor : postProcessBeanFactory");
System.out.println(beanFactory.getBeanDefinitionCount());
}
}
源碼debug圖解
1-4步和BeanFactoryPostProcessor接口的圖解一致
