Spring Boot启动流程

Spring Boot 项目中每次调用接口前都会先启动主启动类,主启动类启动后会进入 main 方法中,并在方法中由 SpringApplication 调用 run(),方法中形参传入当前类的 class 对象以及 main 方法的 args 参数。下一步进入 run() 中,在 run() 中还调用了另一个 run( )。

Spring Boot 启动程序执行 SpringApplication.run(),创建了一个 SpringApplication 对象并执行 run 方法。

一、Spring Boot Starter 的工作原理

1️⃣Spring Boot 在启动时扫描项目所依赖的 JAR 包,寻找包含 spring.factories 文件的 JAR。
2️⃣根据 spring.factories 配置加载 AutoConfigure 类。
3️⃣根据 @Conditional 注解的条件,进行自动配置并将 Bean 注入 Spring Context。

二、实例化 SpringApplication 时做了什么?

①推断 WebApplicationType,主要思想就是在当前的 classpath 下搜索特定的类。
②搜索 META-INF\spring.factories 文件配置的 ApplicationContextInitializer 的实现类。
③搜索 META-INF\spring.factories 文件配置的 ApplicationListenerr 的实现类。
④推断 MainApplication 的 Class。

三、SpringApplication 的 run 方法做了什么?

1️⃣创建一个 StopWatch 并执行 start 方法,这个类主要记录任务的执行时间。
2️⃣配置 Headless 属性,Headless 模式是在缺少显示屏、键盘或者鼠标时候的系统配置。
3️⃣在文件 META-INF\spring.factories 中获取 SpringApplicationRunListener 接口的实现类 EventPublishingRunListener,主要发布 SpringApplicationEvent。
4️⃣把输入参数转成 DefaultApplicationArguments 类。
5️⃣创建Environment并设置比如环境信息,系统熟悉,输入参数和profile信息。
6️⃣打印Banner信息
7️⃣创建 Application 的上下文,根据 WebApplicationTyp 来创建 Context 类,如果非web项目则创建 AnnotationConfigApplicationContext,在构造方法中初始化 AnnotatedBeanDefinitionReader 和 ClassPathBeanDefinitionScanner。
8️⃣在文件 META-INF\spring.factories 中获取 SpringBootExceptionReporter 接口的实现类 FailureAnalyzers。
9️⃣准备 application 的上下文:
①初始化 ApplicationContextInitializer。
②执行 Initializer 的 contextPrepared 方法,发布 ApplicationContextInitializedEvent 事件。
③如果延迟加载,在上下文添加处理器 LazyInitializationBeanFactoryPostProcessor。
④执行加载方法,BeanDefinitionLoader.load 方法,主要初始化了AnnotatedGenericBeanDefinition。
⑤执行 Initializer 的 contextLoaded 方法,发布 ApplicationContextInitializedEvent 事件。

上一篇:Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?


下一篇:Linux阻塞与非阻塞IO访问与异步信号