36-Spring Boot 启动
Spring boot 项目启动
1. 全过程
SpringApplication
的run
方法的实现是我们启动SpringApplication的入口,该方法的主要流程大体可以归纳如下:
- 如果我们使用的是
SpringApplication
的静态run方法,那么,这个方法里面首先要创建一个SpringApplication
对象实例,然后调用这个创建好的SpringApplication
的实例方法。在SpringApplication
实例初始化的时候,它会提前做几件事情:- 根据
classpath
里面是否存在某个特征类(org.springframework.web.context.ConfigurableWebApplicationContext
)来决定是否应该创建一个为Web应用使用的ApplicationContext
类型。 - 使用
SpringFactoriesLoader
在应用的classpath中查找并加载所有可用的ApplicationContextInitializer
。 - 使用
SpringFactoriesLoader
在应用的classpath中查找并加载所有可用的ApplicationListener
。 - 推断并设置main方法的定义类。
- 根据
SpringApplication
实例初始化完成并且完成设置后,就开始执行run方法的逻辑了,方法执行伊始,首先遍历执行所有通过SpringFactoriesLoader
可以查找到并加载的SpringApplicationRunListener
。调用它们的started()
方法,告诉这些SpringApplicationRunListener
,即将开始执行。- 创建并配置当前Spring Boot应用将要使用的
Environment
(包括配置要使用的PropertySource
以及Profile
)。 - 遍历调用所有
SpringApplicationRunListener
的environmentPrepared()
的方法,通知他们已经准备好了。 - 如果
SpringApplication
的showBanner
属性被设置为true,则打印banner。 - 根据用户是否明确设置了
applicationContextClass
类型以及初始化阶段的推断结果,决定该为当前SpringBoot应用创建什么类型的ApplicationContext
并创建完成,然后根据条件决定是否添加ShutdownHook
,决定是否使用自定义的BeanNameGenerator
,决定是否使用自定义的ResourceLoader
,当然,最重要的,将之前准备好的Environment设置给创建好的ApplicationContext
使用。 ApplicationContext
创建好之后,SpringApplication
会再次借助Spring-FactoriesLoader
,查找并加载classpath
中所有可用的ApplicationContext-Initializer
,然后遍历调用这些ApplicationContextInitializer
的initialize(applicationContext)
方法来对已经创建好的ApplicationContext
进行进一步的处理。- 遍历调用所有
SpringApplicationRunListener
的contextPrepared()
方法。 - 最核心的一步,将之前通过
@EnableAutoConfiguration
获取的所有配置以及其他形式的IoC容器配置加载到已经准备完毕的ApplicationContext
。 - 遍历调用所有
SpringApplicationRunListener
的contextLoaded()
方法。 - 调用
ApplicationContext
的refresh()
方法,完成IoC容器可用的最后一道工序。 - 查找当前
ApplicationContext
中是否注册有CommandLineRunner
,如果有,则遍历执行它们。 - 正常情况下,遍历执行
SpringApplicationRunListener的finished()
方法、(如果整个过程出现异常,则依然调用所有SpringApplicationRunListener
的finished()
方法,只不过这种情况下会将异常信息一并传入处理)
2. 参考
36-Spring Boot 启动
https://spricoder.github.io/2022/04/13/Spring-Boot/36-Spring-Boot-%E5%90%AF%E5%8A%A8/