SpringBoot启动过程中,BeanFactoryPostProcessor注册时机

SpringBoot在启动的时候,调用了run方法,在调用SpringApplication的 prepareContext()方法时候,调用了applyInitializers(context)应用初始化方法,applyInitializers(context)方法中,通过获取初始化对象,进行初始化过程,其中initializers中包含多个initializers对象

0 = {DelegatingApplicationContextInitializer@3480} 
1 = {SharedMetadataReaderFactoryContextInitializer@3442} 
2 = {ContextIdApplicationContextInitializer@3481} 
3 = {ConfigurationWarningsApplicationContextInitializer@3482} 
4 = {RSocketPortInfoApplicationContextInitializer@3483} 
5 = {ServerPortInfoApplicationContextInitializer@3484} 
6 = {ConditionEvaluationReportLoggingListener@3485} 
点击查看代码
	protected void applyInitializers(ConfigurableApplicationContext context) {
		for (ApplicationContextInitializer initializer : getInitializers()) {
			Class<?> requiredType = GenericTypeResolver.resolveTypeArgument(initializer.getClass(),
					ApplicationContextInitializer.class);
			Assert.isInstanceOf(requiredType, context, "Unable to call initializer.");
			initializer.initialize(context);
		}
	}
然后调用了initialize(ConfigurableApplicationContext applicationContext) 方法,构建 BeanFactoryPostProcessor后置处理器CachingMetadataReaderFactoryPostProcessor,其中CachingMetadataReaderFactoryPostProcessor是SharedMetadataReaderFactoryContextInitializer的一个内部类,并添加到beanFactoryPostProcessors list对象中,接着继续执行其他初始化动作。ConfigurationWarningsApplicationContextInitializer初始化添加了一个ConfigurationWarningsPostProcessor BeanFactoryPostProcessor后置处理器
class SharedMetadataReaderFactoryContextInitializer{
 	public void initialize(ConfigurableApplicationContext applicationContext) {
   	BeanFactoryPostProcessor postProcessor = new CachingMetadataReaderFactoryPostProcessor(applicationContext);
   	applicationContext.addBeanFactoryPostProcessor(postProcessor);
   }
}

public class ContextIdApplicationContextInitializer{
   public void initialize(ConfigurableApplicationContext applicationContext) {
   	ContextId contextId = getContextId(applicationContext);
   	applicationContext.setId(contextId.getId());
   	applicationContext.getBeanFactory().registerSingleton(ContextId.class.getName(), contextId);
   }
}

public class ConfigurationWarningsApplicationContextInitializer{
   @Override
   public void initialize(ConfigurableApplicationContext context) {
   	context.addBeanFactoryPostProcessor(new ConfigurationWarningsPostProcessor(getChecks()));
   }
}
public class RSocketPortInfoApplicationContextInitializer{
   @Override
   public void initialize(ConfigurableApplicationContext applicationContext) {
   	applicationContext.addApplicationListener(new Listener(applicationContext));
   }
}

public class ServerPortInfoApplicationContextInitializer{
   public void initialize(ConfigurableApplicationContext applicationContext) {
   	applicationContext.addApplicationListener(this);
   }
}

public class ConditionEvaluationReportLoggingListener{
   public void initialize(ConfigurableApplicationContext applicationContext) {
   	this.applicationContext = applicationContext;
   	applicationContext.addApplicationListener(new ConditionEvaluationReportListener());
   	if (applicationContext instanceof GenericApplicationContext) {
   		// Get the report early in case the context fails to load
   		this.report = ConditionEvaluationReport.get(this.applicationContext.getBeanFactory());
   	}
   }
}

其中在初始化过程中,添加到两个工厂后置处理器在后面的BeanDefinition解析过程中,对配置化类的解析、扫描包路径解析发挥了作用。

原文地址:https://www.cnblogs.com/nangonghui/p/15561298.html