源码如下:
/**
* Apply any {@link ApplicationContextInitializer}s to the context before it is
* refreshed.
* @param context the configured ApplicationContext (not refreshed yet)
* @see ConfigurableApplicationContext#refresh()
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
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);
}
}
debug结果如下:
main[1] print getInitializers()
getInitializers() = "[
org.springframework.boot.context.config.DelegatingApplicationContextInitializer@c446b14,
org.springframework.boot.context.ContextIdApplicationContextInitializer@3af356f,
org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer@4443ef6f,
org.springframework.boot.context.web.ServerPortInfoApplicationContextInitializer@7e46d648,
org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer@51751e5f,
org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer@2b0b4d53
]"
下面一个一个分析:
1)DelegatingApplicationContextInitializer
Step completed: "thread=main", org.springframework.boot.context.config.DelegatingApplicationContextInitializer.initialize(), line=54 bci=7
54 List<Class<?>> initializerClasses = getInitializerClasses(environment);
main[1] next
>
Step completed: "thread=main", org.springframework.boot.context.config.DelegatingApplicationContextInitializer.initialize(), line=55 bci=13
55 if (!initializerClasses.isEmpty()) {
main[1] print initializerClasses
initializerClasses = "[]"
main[1] next
>
Step completed: "thread=main", org.springframework.boot.context.config.DelegatingApplicationContextInitializer.initialize(), line=58 bci=28
58 }
什么都不做
2)ContextIdApplicationContextInitializer
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
applicationContext.setId(getApplicationId(applicationContext.getEnvironment()));
}
119 return name;
main[1] print name
name = "zipkin-server:shared:9411"
main[1] step
>
Step completed: "thread=main", org.springframework.boot.context.ContextIdApplicationContextInitializer.initialize(), line=105 bci=11
105 applicationContext.setId(getApplicationId(applicationContext.getEnvironment()));
main[1] stepsdf
Unrecognized command: 'stepsdf'. Try help...
main[1] print applicationContext
applicationContext = "org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@38f2e97e: startup date [Thu Jan 01 08:00:00 CST 1970]; root of context hierarchy"
3)ConfigurationWarningsApplicationContextInitializer
@Override
public void initialize(ConfigurableApplicationContext context) {
//这里
context.addBeanFactoryPostProcessor(
new ConfigurationWarningsPostProcessor(getChecks()));
}
4)ServerPortInfoApplicationContextInitializer
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
applicationContext.addApplicationListener(
new ApplicationListener<EmbeddedServletContainerInitializedEvent>() {
@Override
public void onApplicationEvent(
EmbeddedServletContainerInitializedEvent event) {
ServerPortInfoApplicationContextInitializer.this
.onApplicationEvent(event);
}
});
}
增加一个监听器
5)SharedMetadataReaderFactoryContextInitializer
略
6)AutoConfigurationReportLoggingInitializer
主要是设置自动配置的Bean