Spring Boot 底层启动过程
Spring Boot 启动过程分为两个阶段:Spring 应用上下文准备阶段和 Spring 应用上下文装载阶段。
Spring 应用上下文准备阶段
1. 加载 SpringApplication
Spring Boot 应用程序从 entry point 开始执行。通常情况下,入口点是使用 SpringApplication 类的静态 run() 方法启动的。
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
在静态 run() 方法中,SpringApplication 使用了以下默认值:
public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {
return new SpringApplication(primarySources).run(args);
}
- primarySources:应用程序的主要配置类。如果您的应用程序没有任何配置类,则可以将值设置为 null,或者将其留空,因为这将是 Java 的一个 varargs 数组。
- args:应用程序所接收的命令行参数。
2. 加载 Spring 应用程序上下文(ApplicationContext)
SpringApplication.run()
方法会创建一个 Spring 应用上下文(ApplicationContext)。在 Spring Boot 中,使用 AnnotationConfigApplicationContext 或 AnnotationConfigServletWebServerApplicationContext,这取决于您是使用 Spring Boot 还是 Spring MVC。
public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {
SpringApplicationBuilder builder = createSpringApplicationBuilder(primarySources);
return builder.run(args);
}
private static SpringApplicationBuilder createSpringApplicationBuilder(Class<?>[] primarySources) {
Assert.notNull(primarySources, "PrimarySources must not be null");
return new SpringApplicationBuilder(primarySources);
}
3. 定制 SpringApplication
SpringApplication 可以定制许多属性。您可以通过其构造函数或使用 setter 设置这些属性。下面是常用的属性:
- Banner:在应用程序启动时打印的 ASCII 标志。可以通过将“banner.txt”放在主类路径中来自定义标志。
- Source:应用程序的主要源。
- AdditionalProfiles:要添加到应用程序中的其他配置文件。
- Properties:要向 SpringApplication 提供的额外属性。
4. 监听 SpringApplication 事件
SpringApplication 可以使用 addListeners() 方法或实现 ApplicationListener 接口来监听事件。可以监听以下事件:
- ApplicationStartingEvent:应用程序开始启动时触发。
- ApplicationEnvironmentPreparedEvent:将环境设置为上下文时触发。可以修改环境属性。
- ApplicationContextInitializedEvent:在创建 ApplicationContext 类型之前触发,允许查看最早可用的 bean。
- ApplicationPreparedEvent:在加载应用程序上下文(但在刷新之前)时触发。
- ContextRefreshedEvent:在应用程序上下文刷新时触发。通常在应用程序启动后执行一些操作。
- ServletWebServerInitializedEvent:在创建嵌入式 Servlet 容器之后触发。
Spring 应用上下文装载阶段
1. 加载配置
Spring Boot 使用多种选项来为我们的应用程序加载配置。这是 Spring Boot 配置加载的默认顺序:
- 当前目录下的 config 子目录。
- 当前目录。
- classpath 下的 config 包。
- classpath 根目录。
配置文件名称为 application。当存在多个文件时,Spring Boot 将应用程序所在的地方作为默认配置文件。例如,如果我们在主应用程序中使用 @EnableAutoConfiguration
,Spring Boot 将自动搜索主应用程序中的任何 bean。
2. 加载过程监听器
当程序运行时,Spring 上下文上会出现很多监听器。可以通过使用 ApplicationContext.addApplicationListener() 将我们自己的监听器添加到 ApplicationContext 中。下面是可用的监听器:
- ApplicationStartedEvent:ApplicationContext 加载完成后,但在它被刷新之前。
- ApplicationReadyEvent:刷新之后间隔一段时间(之后,而不是之前)调用,以表明应用程序已经准备好接受请求。
- ApplicationFailedEvent:如果 Spring Boot 应用程序启动时出现异常,将触发此事件。
示例一
@SpringBootApplication
public class AccountingApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(AccountingApplication.class, args);
context.addApplicationListener(event -> {
if (event instanceof ApplicationStartedEvent) {
System.out.println("应用启动完成");
}
});
}
}
在本示例中,我们通过 SpringApplication.run()
方法实例化 Spring Boot 应用程序,并添加了一个自定义的 ApplicationStartedEvent 监听器。这个监听器在应用程序启动完成后会打印出一条信息。
示例二
public class MyApplication {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(MyApplication.class);
application.addListeners(new ApplicationPidFileWriter());
application.run(args);
}
}
在本示例中,我们实例化了一个 Spring Boot 应用程序,并添加了一个 ApplicationPidFileWriter 监听器。这个监听器在应用程序正常关闭时,将应用程序的 PID 写入到文件中。可以在 /tmp/myapplication.pid 文件中找到 PID。
以上就是 Spring Boot 底层启动过程的完整攻略,包含了示例以及代码解释。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Springboot详解底层启动过程 - Python技术站