基于
Springboot 1.5.8
源代码分析
SpringApplication
的初始化过程由方法 initialize() 完成
1.接收和设置源 sources
sources
是用于识别bean
定义的信息来源, 参数类型是一个对象数组,实际上对于 Spring boot
应用来讲, 缺省情况下,这里只传入了应用入口程序的类作为参数。下面是 sources
被传入 initialize()
方法的过程。
// 应用入口程序类
@SpringBootApplication
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
上面main
方法中将应用程序入口类作为下面run
方法的参数source
,而下面方法将source
变成数组形式 :
public static ConfigurableApplicationContext run(Object source, String... args) {
return run(new Object[] { source }, args);
}
// 进一步的实现,变成数组形式的 sources 被作为 SpringApplication 类构造函数的参数传入
public static ConfigurableApplicationContext run(Object[] sources, String[] args) {
return new SpringApplication(sources).run(args);
}
SpringApplication
类将数组形式的 sources
传递给自己的初始化方法 initialize()
public SpringApplication(Object... sources) {
initialize(sources);
}
2. 推断是否Web
应用环境
如果这些类在 classpath
上都存在,则认为这是个Web
应用环境 :
javax.servlet.Servlet
org.springframework.web.context.ConfigurableWebApplicationContext
3. 设置 ApplicationContextInitializer
使用内部工具类SpringFactoriesLoader
加载所有ApplicationContextInitializer
实现类并实例化 :
//缺省 Web SpringApplication 应用会有以下 6 个 ApplicationContextInitializer:
//1.初始化任务委托给Environment指定的初始化器,
//相当于给外界提供了一个添加自定义ApplicationContextInitializer的入口
//委托给Environment属性context.initializer.classes下指定的ApplicationContextInitializer类,
DelegatingApplicationContextInitializer
//2.设置Spring ApplicationContext ID
//这些环境变量会被用来产生Spring ApplicationContext ID :
// spring.application.name,vcap.application.name,spring.config.name
// 如果没有找到以上属性设置,ID使用 application
ContextIdApplicationContextInitializer
//3.用于报告一般配置错误,
//添加BeanFactoryPostProcessor : ConfigurationWarningsPostProcessor
ConfigurationWarningsApplicationContextInitializer
//4.添加 ApplicationListener<EmbeddedServletContainerInitializedEvent>
ServerPortInfoApplicationContextInitializer
//5.在ConfigurationClassPostProcessor和Spring boot之间增加一个共享的CachingMetadataReaderFactory
//添加BeanFactoryPostProcessor : CachingMetadataReaderFactoryPostProcessor
SharedMetadataReaderFactoryContextInitializer
//6.将ConditionEvaluationReport写到log,在DEBUG级别下输出
//添加AutoConfigurationReportListener
AutoConfigurationReportLoggingInitializer
4. 设置 ApplicationListener
使用内部工具类 SpringFactoriesLoader
加载所有类型 ApplicationListener
并实例化。
// 缺省 Web SpringApplication 应用会有以下10个 ApplicationListener
ConfigFileApplicationListener
AnsiOutputApplicationListener
LoggingApplicationListener
ClasspathLoggingApplicationListener
BackgroundPreinitializer
DelegatingApplicationListener
ParentContextCloserApplicationListener
ClearCachesApplicationListener
FileEncodingApplicationListener
LiquibaseServiceLocatorApplicationListener
5. 推断应用程序主类
实例化一个运行时异常,从其堆栈跟踪信息中找到 main()
方法所在的类。