Spring Boot 是当前 Java 开发领域的热门框架之一,其简化了应用的开发和部署。为了更好地理解和掌控 Spring Boot 项目,我们需要深入了解其生命周期的各个阶段,从启动到销毁,每个步骤的关键点和核心机制。
本文将详细解析 Spring Boot 应用的生命周期,并结合代码实例和实际场景,帮助开发者清晰掌握这一过程。
Spring Boot 应用程序的生命周期可以看作是多个事件和阶段的集合,这些阶段相互独立又彼此关联。主要包括以下几个阶段:
application.properties 或 application.yml)。SpringApplication:生命周期的入口,负责初始化应用上下文。SpringApplicationRunListeners:监听应用启动的事件。创建 SpringApplication 对象:
SpringApplication 是 Spring Boot 启动的核心入口。
SpringApplication application = new SpringApplication(MyApplication.class);
application.run(args);准备环境:
调用 prepareEnvironment 方法,加载配置文件并初始化 ConfigurableEnvironment。
@PropertySource 或 EnvironmentPostProcessor 自定义环境加载。通过 EnvironmentPostProcessor 在初始化阶段添加环境变量:
@Component
public class CustomEnvironmentPostProcessor implements EnvironmentPostProcessor {
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
Map<String, Object> customMap = new HashMap<>();
customMap.put("app.custom.config", "customValue");
environment.getPropertySources().addLast(new MapPropertySource("customSource", customMap));
}
}ApplicationContext:Spring 上下文的核心接口。ApplicationListener:监听并处理上下文事件。BeanPostProcessor:用于拦截 Bean 的初始化和销毁过程。@Component、@Service 等注解并注册 Bean。
BeanFactory 和 BeanPostProcessor 对 Bean 进行实例化和初始化。
ApplicationEvent:
例如 ContextRefreshedEvent 事件,通知所有监听器完成上下文刷新。
通过 ApplicationListener 监听上下文刷新事件:
@Component
public class CustomContextRefreshedListener implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
System.out.println("上下文刷新完成,所有 Bean 已注册");
}
}CommandLineRunner:应用启动后执行额外逻辑。ApplicationRunner:类似 CommandLineRunner,提供更灵活的参数解析功能。TomcatWebServer。SpringApplication.run 方法自动启动。
Filter、Interceptor 等 Web 组件。
CommandLineRunner 或 ApplicationRunner 接口的 Bean。
通过 CommandLineRunner 在应用启动后执行初始化逻辑:
@Component
public class CustomCommandLineRunner implements CommandLineRunner {
@Override
public void run(String... args) {
System.out.println("应用启动完成,执行自定义初始化逻辑");
}
}DisposableBean:用于销毁 Bean。@PreDestroy 注解:销毁前的回调。ContextClosedEvent:
Spring 在应用关闭时会发布此事件。
DisposableBean 接口或标注了 @PreDestroy 注解的方法。
通过 @PreDestroy 实现销毁逻辑:
@Component
public class CustomShutdownBean {
@PreDestroy
public void onDestroy() {
System.out.println("执行自定义销毁逻辑,释放资源");
}
}Spring Boot 提供了多个扩展点,开发者可以根据需求在生命周期的不同阶段插入自定义逻辑。
事件名称 | 触发时机 | 常见用途 |
|---|---|---|
ApplicationStartingEvent | 应用启动开始时 | 打印 Banner,初始化日志配置 |
ApplicationEnvironmentPreparedEvent | 环境变量已加载,但上下文尚未创建 | 自定义配置环境变量 |
ApplicationPreparedEvent | 上下文已创建,尚未刷新 | 注册 Bean 动态扩展 |
ApplicationStartedEvent | 上下文刷新完成,服务器已启动 | 执行启动后初始化逻辑 |
ApplicationReadyEvent | 应用已完全启动 | 通知外部服务应用可用 |
ApplicationFailedEvent | 启动失败 | 日志记录,清理资源 |
InitializingBean:初始化时回调。DisposableBean:销毁时回调。@PostConstruct 和 @PreDestroy:更简洁的生命周期注解。ApplicationContextInitializer在上下文刷新前插入逻辑:
public class CustomContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext context) {
System.out.println("上下文初始化逻辑");
}
}注册:
SpringApplication application = new SpringApplication(MyApplication.class);
application.addInitializers(new CustomContextInitializer());
application.run(args);原因:依赖注入失败、Bean 定义冲突。 解决方案:
@Primary 或 @Qualifier 指定具体的 Bean。原因:未正确实现销毁回调。 解决方案:
@PreDestroy 或 DisposableBean 实现资源释放逻辑。Spring Boot 的生命周期贯穿应用程序的启动、运行和关闭。理解其生命周期不仅能帮助开发者快速定位问题,还能充分利用扩展点实现更复杂的功能。
通过本文的学习,你应该已经掌握了:
让我们在实际项目中灵活运用这些知识,打造更稳定、高效的 Spring Boot 应用!