Spring注解驱动开发——BeanDefinitionRegistryPostProcessor

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()方法

你可能感兴趣的:(Spring注解驱动开发)