BeanDefinitionRegistryPostProcessor:是BeanFactoryPostProcessor的子接口,bean定义注册中心的后置处理器,定义了一个postProcessBeanDefinitionRegistry方法,允许在IOC容器标准初始化之后修改bean定义注册中心,在所有合法的bean定义将要被加载但还没有被实例化之前调用该方法,它的执行在BeanFactoryPostProcessor接口的postProcessBeanFactory之前
@Component public class MyBeanDefResgPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println(beanFactory.getBeanDefinitionCount());
}
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
System.out.println(registry.getBeanDefinitionCount());
}
}
入参BeanDefinitionRegistry是bean定义的保存中心,BeanFactory就是按照BeanDefinitionRegistry中保存的每一个bean定义信息创建实例的,bean的scope、类型、id等都保存在BeanDefinitionRegistry中,可以在调用postProcessBeanDefinitionRegistry方法时利用BeanDefinitionRegistry来注册新的bean:
@Component
public class MyBeanDefResgPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println(beanFactory.getBeanDefinitionCount());//12
}
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
System.out.println(registry.getBeanDefinitionCount());//10
RootBeanDefinition beanDefinition = new RootBeanDefinition(Bike.class);
registry.registerBeanDefinition("hello", beanDefinition);
System.out.println(registry.getBeanDefinitionCount());//11
AbstractBeanDefinition beanDefinition2 = BeanDefinitionBuilder.rootBeanDefinition(Car.class).getBeanDefinition();
registry.registerBeanDefinition("hello2", beanDefinition2);//12
System.out.println(registry.getBeanDefinitionCount());
}
}
注意在registerBeanDefinition时id相同的bean定义会被后面注册的覆盖掉
原理:
1)、创建IOC容器对象(ApplicationContext对象)
2)、执行refresh()->invokeBeanFactoryPostProcessors(beanFactory)
3)、执行invokeBeanFactoryPostProcessors时先从容器中获取到所有的BeanDefinitionRegistryPostProcessor组件
1、依次触发所有的postProcessBeanDefinitionRegistry()方法
2、再来触发BeanDefinitionRegistryPostProcessor的postProcessBeanFactory()方法
4)、接着从容器中找到BeanFactoryPostProcessor组件,然后依次触发其postProcessBeanFactory()方法