SpringBoot版本:2.1.1 ==》启动流程分析汇总
能力有限,没解释到或解释不正确的地方忘谅解,欢迎评论指正,持续更新。
目录
准备工作
新建子项目SpringBoot_StartupPprocess,导入的依赖是spring-boot-starter-web,为web环境。
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.eastcom</groupId>
<artifactId>SpringBoot_Demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>SpringBoot_StartupPprocess</artifactId>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
创建主类Application。main方法的两种编写方式如下。直接走第二种方式的流程。
@SpringBootApplication
public class Application {
public void main(String[] args) {
//第一种方式:直接调用SpringApplication的静态run方法(内部转换后用下面第二种方法)
SpringApplication.run(Application.class, args);
//第二种方式:先实例化SpringApplication,再调用run方法
SpringApplication application = new SpringApplication(Application.class);
application.run(args);
}
}
流程分析
1、SpringApplication的构造方法
来看一下在SpringApplication对象的构造方法中都做了哪些事。
public SpringApplication(Class<?>... primarySources) {
this(null, primarySources);
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
this.resourceLoader = resourceLoader;
//判断primarySources不能为空
Assert.notNull(primarySources, "PrimarySources must not be null");
//将primarySources放入SpringApplication的全局变量primarySources,Set集合中
this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
//从类路径中推断应用程序类型放到SpringApplication的全局变量webApplicationType
this.webApplicationType = WebApplicationType.deduceFromClasspath();
//从META-INF/spring.factories文件中获取ApplicationContextInitializer接口的实现类并利用反射创建对象返回放入SpringApplication的全局变量initializers,List集合中
setInitializers((Collection) getSpringFactoriesInstances(
ApplicationContextInitializer.class));
//同上,也是从META-INF/spring.factories文件中获取ApplicationListener接口的实现类并利用反射创建对象返回放入SpringApplication的全局变量listeners,List集合