Spring注解驱动开发——BeanDefinitionRegistryPostProcessor

本文介绍了BeanDefinitionRegistryPostProcessor,它是BeanFactoryPostProcessor的子接口,可在IOC容器标准初始化后修改bean定义注册中心。入参BeanDefinitionRegistry保存bean定义信息,可用于注册新bean。还阐述了其原理,包括创建IOC容器、执行相关方法及触发组件方法等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值