一、
BeanDefinitionRegistryPostProcessor
后置处理器
BeanDefinitionRegistryPostProcessor
BeanDefinitionRegistryPostProcessor
接口继承
BeanFactoryPostProcessor
接口,在所有bean定义信息
将要被加载
,bean实例还没有创建的时候执行。
BeanDefinitionRegistry
是bean定义信息的
保存中心
,以后
BeanFactory
就是按照
BeanDefinitionRegistry
里面保存的每一个bean定义信息
创建
bean实例
BeanDefinitionRegistryPostProcessor
会在
BeanFactoryPostProcessor
之前执行,可以利用
BeanDefinitionRegistryPostProcessor
给容器中添加一些其它组件
自定义
MyBeanDefinitionRegistryPostProcessor
组件,实现
BeanDefinitionRegistryPostProcessor
接口
@Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
System.out.println("MyBeanDefinitionRegistryPostProcessor...postProcessBeanDefinitionRegistry方法 " +
"Bean的数量:" + registry.getBeanDefinitionCount());
//手动注册一些bean定义信息
RootBeanDefinition beanDefinition = new RootBeanDefinition(Girl.class);
registry.registerBeanDefinition("helloGirl",beanDefinition);
AbstractBeanDefinition beanDefinition1 = BeanDefinitionBuilder.rootBeanDefinition(Girl.class).getBeanDefinition();
registry.registerBeanDefinition("byeGirl",beanDefinition1);
}
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("MyBeanDefinitionRegistryPostProcessor...postProcessBeanFactory方法 " +
"Bean的数量:" + beanFactory.getBeanDefinitionCount());
}
}
测试
二、
BeanDefinitionRegistryPostProcessor
优先执行原理
BeanDefinitionRegistryPostProcessor
首先是准备创建ioc容器
调用
refresh()
刷新容器
refresh()
方法会调用
invokeBeanFactoryPostProcessors(beanFactory)
方法
invokeBeanFactoryPostProcessors(beanFactory)
方法会从容器中获取到所有的
BeanDefinitionRegistryPostProcessor
组件,然后调用
invokeBeanDefinitionRegistryPostProcessors()
方法
遍历每一个
BeanDefinitionRegistryPostProcessor
组件,触发
postProcessBeanDefinitionRegistry()
方法
执行自定义的
postProcessBeanDefinitionRegistry()
方法
执行完
invokeBeanDefinitionRegistryPostProcessors()
方法之后,会继续调用
invokeBeanFactoryPostProcessors()
方法
遍历每一个
BeanDefinitionRegistryPostProcessor
组件,触发
postProcessBeanFactory()
方法,这个方法是
BeanFactoryPostProcessor
规定的方法,但是
BeanDefinitionRegistryPostProcessor
接口继承了
BeanFactoryPostProcessor
接口,重写了该方法
执行自定义的
postProcessBeanFactory()
方法
至此,
BeanDefinitionRegistryPostProcessor
的两个方法都执行完成,即
BeanDefinitionRegistryPostProcessor
组件执行完毕。
接下来会从容器中找到
BeanFactoryPostProcessor
组件,依次触发
postProcessBeanFactory()
方法,由于
BeanDefinitionRegistryPostProcessor
组件优先
BeanFactoryPostProcessor
组件执行,所以
BeanDefinitionRegistryPostProcessor
组件继承的
postProcessBeanFactory()
方法也会优先于
BeanFactoryPostProcessor
组件里面的
postProcessBeanFactory()
方法
所以,
BeanDefinitionRegistryPostProcessor
组件优先
BeanFactoryPostProcessor
组件执行