参考:
https://www.cnblogs.com/zheting/p/6707035.htm
https://blog.hanqunfeng.com/2016/12/13/spring-boot-study-springapplication/
一、调用static方法
ctrl+单击看源码
public static ConfigurableApplicationContext run(Object source, String... args) {
return run(new Object[]{source}, args);
}
public static ConfigurableApplicationContext run(Object[] sources, String[] args) {
return (new SpringApplication(sources)).run(args);
}
二、创建SpringApplication对象
SpringApplication.run()先创建一个SpringApplication对象实例,继续看构造函数
public SpringApplication(Object... sources) {
this.bannerMode = Mode.CONSOLE;//banner的打印模式,此时是控制台模式
this.logStartupInfo = true;//开启日志
this.addCommandLineProperties = true;//启用CommandLineProperties
this.headless = true;//开启headless模式支持
this.registerShutdownHook = true;//启用注册ShutdownHook,用于在非Web应用中关闭IoC容器和资源
this.additionalProfiles = new HashSet();
this.initialize(sources);
}
三、初始化
接着看初始化方法:
private void initialize(Object[] sources) {
if (sources != null && sources.length > 0) {
this.sources.addAll(Arrays.asList(sources));
}
//3.1判断是否是web运行环境,如果classpath中是否含有**WEB_ENVIRONMENT_CLASSES**指定的全部类,则返回true
this.webEnvironment = this.deduceWebEnvironment();
//3.2找到*META-INF/spring.factories*中声明的所有ApplicationContextInitializer的实现类并将其实例化
this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));
//3.3找到*META-INF/spring.factories*中声明的所有ApplicationListener的实现类并将其实例化
this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));
//3.4获得当前执行main方法的类对象,这里就是SpringBootWebDemoApplication的实例
this.mainApplicationClass = this.deduceMainApplicationClass();
}
3.1判断是否是web运行环境
如果classpath中含有WEB_ENVIRONMENT_CLASSES指定的全部类,则返回true,用于创建指定类型的ApplicationContext对象。
private static final String[] WEB_ENVIRONMENT_CLASSES = new String[]{"javax.servlet.Servlet", "org.springframework.web.context.ConfigurableWebApplicationContext"};
3.2加载ApplicationContextInitializer
大体的过程就是通过SpringFactoriesLoader检索org.springframework.boot:spring-boot-autoconfigure下的META-INF/spring.factories,找到声明的所有ApplicationContextInitializer的实现类并将其实例化。
ApplicationContextInitializer是Spring框架中的接口,其作用可以理解为在ApplicationContext执行refresh之前,调用ApplicationContextInitializer的initialize()方法,对ApplicationContext做进一步的设置和处理。
public interface ApplicationContextInitializer<C extends ConfigurableApplicationContext> {
void initialize(C var1);
}
springboot1.5.9.RELEASE版本中的META/spring.factories包含的ApplicationContextInitializer:
# Initializers
org.springframework.context.ApplicationContextInitializer=\
org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\
org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer
3.3加载ApplicationListener
大体的过程就是通过SpringFactoriesLoader检索META-INF/spring.factories,找到声明的所有ApplicationListener的实现类并将其实例化。
ApplicationListener是Spring框架中的接口,就是事件监听器,其作用可以理解为在SpringApplicationRunListener发布通知事件时,由ApplicationListener负责接收。
public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {
void onApplicationEvent(E var1);
}
SpringBoot只提供了一个SpringApplicationRunListener的实现类,就是EventPublishingRunListener,其作用是在SpringBoot启动过程中,负责注册ApplicationListener监听器,在不同时间点发布不同的事件类型,如果有哪些ApplicationListener的实现类监听了这些事件,则可以接受并处理。
public interface SpringApplicationRunListener {
//通知监听器,SpringBoot开始执行
void starting();
//通知监听器,Environment准备完成
void environmentPrepared(ConfigurableEnvironment var1);
//通知监听器,ApplicationContext已经创建并初始化完成
void contextPrepared(ConfigurableApplicationContext var1);
//通知监听器,ApplicationContext已经完成IoC配置加载
void contextLoaded(ConfigurableApplicationContext var1);
//通知监听器,SpringBoot启动完成
void finished(ConfigurableApplicationContext var1, Throwable var2);
}
spring-boot-autoconfigure-1.5.9.RELEASE.jar中的META-INF/spring.factories包含的ApplicationListener
# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.autoconfigure.BackgroundPreinitializer
spring-boot-1.5.9.RELEASE.jar中的META-INF/spring.factories包含的ApplicationListener
# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.ClearCachesApplicationListener,\
org.springframework.boot.builder.ParentContextCloserApplicationListener,\
org.springframework.boot.context.FileEncodingApplicationListener,\
org.springframework.boot.context.config.AnsiOutputApplicationListener,\
org.springframework.boot.context.config.ConfigFileApplicationListener,\
org.springframework.boot.context.config.DelegatingApplicationListener,\
org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListener,\
org.springframework.boot.logging.ClasspathLoggingApplicationListener,\
org.springframework.boot.logging.LoggingApplicationListener
3.4设置main方法定义类
获得当前只需main方法的类对象,这里就是XXXApplication的实例。
网友评论