springboot 启动源码分析
一、springboot 启动原理
1、概述
一个springboot项目的启动非常简单,只要启动一个main方法就可以完成整个项目的启动。
- 1、而且项目创建非常快,几秒钟就可以搭建完成;
- 2、快速集成插件,Spring Boot 提供了依赖添加,快速的集成各种框架;
- 3、内置了 Web 容器(嵌入的Tomcat);
- 4、提供了很多监控的指标;
- 5、零 XML配置;
- 6、简化Maven 配置
- 7、自动配置Spring
2、启动类如下:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
就是这个run方法,执行这个run方法就完成了一个springboot项目的启动, 其实这个run
方法要大体上完成两个事情:
- 1、完成spring容器的启动,把需要扫描的类实例化
- 2、启动Servlet容器,完成Servlet容器的启动
进入SpringApplication.run(SpringBootApp.class,args);的run方法分析得出spring启动的核心代码就是refreshContext(context);其上下文对象就AnnotationConfigServletWebServerApplicationContext
重点分析一下这个refreshContext(context)方法,springboot的spring容器的启动最终是掉到了上下文对象的refresh方法的。
为什么要使用嵌入式服务器?
节省了下载tomcat,应用程序也不需要再打war包放在webapp目录下运行,只需要安装java虚拟机就可以直接部署应用程序,springboot已经内置了tomcat.jar,会利于其spi 机制加载SpringMVC。
3、主要流程大体可以归纳如下:
-
1、首先要创建一个SpringApplication对象实例,然后调用这个创建好的SpringApplication的实例方法。在SpringApplication实例初始化的时候,它会提前做几件事情:
- 根据classpath里面是否存在某个特征类(org.springframework.web.context.ConfigurableWebApplicationContext)来决定是否应该创建一个为Web应用使用的ApplicationContext类型。
- 使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationContextInitializer和ApplicationListener
-
2、 SpringApplication实例初始化完成并且完成设置后,就开始执行run方法的逻辑了,首先遍历执行所有通过SpringFactoriesLoader可以查找到并加载的SpringApplicationRunListener。调用它们的started()方法。
-
3、 创建并配置当前Spring Boot应用将要使用的Environment(包括配置要使用的PropertySource以及Profile)。
-
4、 遍历调用所有SpringApplicationRunListener的environmentPrepared()的方法,告诉他们Environment准备好了”。
-
5、 如果SpringApplication的showBanner属性被设置为true,则打印banner。
-
6、根据用户是否明确设置了applicationContextClass类型以及初始化阶段的推断结果,决定该为当前SpringBoot应用创建什么类型的ApplicationContext并创建完成,将之前准备好的Environment设置给创建好的ApplicationContext使用。
-
7、 ApplicationContext创建好之后,SpringApplication会再次借助Spring-FactoriesLoader,查找并加载classpath中所有可用的ApplicationContext-Initializer,然后遍历调用这些ApplicationContextInitializer的initialize(applicationContext)方法来对已经创建好的ApplicationContext进行进一步的处理。
-
8、遍历调用所有SpringApplicationRunListener的contextPrepared()方法。
-
9、将之前通过@EnableAutoConfiguration获取的所有配置以及其他形式的IoC容器配置加载到已经准备完毕的ApplicationContext。
-
10、 遍历调用所有SpringApplicationRunListener的contextLoaded()方法。
-
11、 调用ApplicationContext的refresh()方法,完成IoC容器可用的最后一道工序。
-
12、 查找当前ApplicationContext中是否注册有CommandLineRunner,如果有,则遍历执行它们。
-
13、 正常情况下,遍历执行SpringApplicationRunListener的finished()方法、(如果整个过程出现异常,则依然调用所有SpringApplicationRunListener的finished()方法,只不过这种情况下会将异常信息一并传入处理)
简洁版:
- 加载并解析配置:Spring Boot会加载并解析应用的配置文件(application.properties或application.yml),并将配置信息绑定到对应的Spring Boot自动配置类中
- 启动Spring应用上下文:Spring Boot会启动Spring应用上下文,也称为ApplicationContext。 ApplicationContext是Spring的核心容器,负责管理Bean的创建、依赖注入等工作。
- 自动配置:Spring Boot会根据应用的依赖和配置情况,自动配置一些常用的功能和组件。这些自动配置类通常通过@EnableAutoConfiguration注解来引入。
- 扫描和注册Bean:Spring Boot会扫描应用中的@Component、@Controller等注解,自动注册成为Spring的Bean,并加入到应用上下文中供后续使用。
- 调用ApplicationContext的refresh()方法,完成IoC容器最后的实例化。
- 启动内嵌的Web服务器:如果应用有Web功能,Spring Boot会启动一个内嵌的Web服务器(如Tomcat、Jetty),并将控制权交给该服务器处理请求。