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接口的圖解一致