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);
}
}
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解析过程中,对配置化类的解析、扫描包路径解析发挥了作用。