SpringBoot-run启动原理
本文主要讲解SpringBoot启动类中的run( )方法。
启动类-----------run()方法
@SpringBootApplication
public class ApplicationTest {
public static void main(String[] args) {
SpringApplication.run(ApplicationTest.class);
}
}
1.如果我们使用的是SpringApplication的静态run方法,那么,这个方法里面首先要创建一个SpringApplication对象实例,然后调用这个创建好的实例对象的实例方法。
在SpringApplication实例初始化的时候,它会提前做几件事情:
- 根据classpath里面是否存在某个特征类 (org.springframework.web.context.ConfigurableWebApplicationContext)来判断应用的类型(Web项目还是普通Java)。
- 使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的 ApplicationContextInitializer初始化器。
- 使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的 ApplicationListener监听器。
- 推断并设置main方法的定义类。
2.SpringApplication实例初始化并完成设置后,就开始执行run方法的逻辑了,首先遍历执行所有查找到的SpringApplicationRunListener监听器。调用它们的started()方法。
这个方法主要就是发布ApplicationStartedEvent应用程序开始事件
3.创建并配置当前Spring Boot应用将要使用的Environment环境(确定是否web环境)还有参数的装配
参数包括配置要使用的PropertySource配置属性源以及Profile配置文件
4.遍历调用所有SpringApplicationRunListener的environmentPrepared()的方法
这个方法就是发布ApplicationEnvironmentPreparedEvent应用程序环境准备事件。
5.如果SpringApplication的showBanner属性被设置为true,则打印banner。
banner:英文广告横幅,在这里面指的是运行时输出的SpringBoot画面,还可以进行修改
6.创建ApplicationContext。然后根据条件决定是否添加ShutdownHook,判断是否使用自定义的ResourceLoader,以及完成Bean的定义信息,将之前准备好的Environment环境给创建好的ApplicationContext使用,其实就是根据是否为web环境,来决定创建什么类型的ApplicationContext。
ShutdownHook:在Java程序中可以通过添加关闭钩子,实现让程序退出时关闭资源、平滑退出的一个功能。
7.ApplicationContext创建好之后,SpringApplication会再次借助Spring-FactoriesLoader,查找并加载classpath中所有可用的ApplicationContext-Initializer初始化器,然后遍历调用这些ApplicationContextInitializer的initialize(applicationContext)初始化方法来对已经创建好的ApplicationContext应用上下文进行进一步的处理。
8.遍历调用所有SpringApplicationRunListener的contextPrepared()方法。
这个方法就是发布ApplicationPreparedEvent应用程序准备事件
9.将之前通过@EnableAutoConfiguration获取的所有配置以及其他形式的IoC容器配置加载到已经准备好的ApplicationContext。
10.遍历调用所有SpringApplicationRunListener的contextLoaded()方法。
11.调用ApplicationContext的refresh()方法,装配context,beanfactory等重要的核心组件,完成IoC容器可用的最后一道工序,完成程序启动。
12.查找当前ApplicationContext中是否注册有CommandLineRunner,如果有,则遍历执行它们。
CommandLineRunner 指的是平常开发中有可能需要实现在项目启动后自动执行的一个功能,比如:数据预加载
13.正常情况下,遍历执行SpringApplicationRunListener的finished()方法、就是发布ApplicationReadyEvent事件,启动完毕,表示服务已经可以开始正常提供服务了,该步骤在所有bean初始化完毕,所有回调处理完成,系统准备处理服务请求时触发。
如果整个过程出现异常,则依然调用所有SpringApplicationRunListener的finished()方法,只不过这种情况下会将异常信息一并传入处理
以上就是run( )方法的讲解,没讲太深,步骤主要就是这些,如有错误或者讲解不到位的地方,请谅解并指出问题,发表自己的意见,一起共同讨论问题,谢谢。