扩展原理——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优先执行原理
首先是准备创建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组件执行