一、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
组件执行