为什么自定义的BeanDefinitionRegistryPostProcessor不能在Spring加载过程中第一阶段初始化

在Spring Boot 2.2.1和JDK 1.8环境下,自定义的BeanDefinitionRegistryPostProcessor无法在Spring加载过程的第一阶段即AbstractApplicationContext的refresh方法调用时初始化。原因是此时beanFactory中的bean还未加载,内部bean由AnnotationConfigUtils.registerAnnotationConfigProcessors在AnnotationConfigApplicationContext构造过程中注册。要实现早期初始化,可以监听ApplicationContextInitializedEvent事件或使用ApplicationContextInitializer。这两种方法都需要在spring.factory文件中进行配置。
摘要由CSDN通过智能技术生成

Spring boot:2.2.1

jdk:1.8

 

所谓的Spring加载过程的第一阶段是指下面这个地方:

AbstractApplicationContext的refrsh方法的registerBeanPostProcessors(beanFactory);会进入到下面到方法里面:PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors

public static void invokeBeanFactoryPostProcessors(
			ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {

		// Invoke BeanDefinitionRegistryPostProcessors first, if any.
		Set<String> processedBeans = new HashSet<>();

		if (beanFactory instanceof BeanDefinitionRegistry) {
			BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
			List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
			List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();

			// 省略

			// Do not initialize FactoryBeans here: We need to leave all regular beans
			// uninitialized to let the bean factory post-processors apply to them!
			// Separate between BeanDefinitionRegistryPostProcessors that implement
			// PriorityOrdered, Ordered, and the rest.
			List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();

			// First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
			String[] postProcessorNames =
					beanFactory.getBean
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值