Spring Boot 启动流程解析

 更新时间:2024年12月05日 11:01:19   作者:( •̀∀•́ )920  
Spring Boot 是一个简化的 Spring 应用开发框架,它以 “约定优于配置” 的理念,为开发者提供了开箱即用的功能,本文将详细剖析其内部实现,帮助你深入理解 Spring Boot 的启动机制,感兴趣的朋友跟随小编一起看看吧

Spring Boot 是一个简化的 Spring 应用开发框架,它以 “约定优于配置” 的理念,为开发者提供了开箱即用的功能。在 Spring Boot 的运行过程中,SpringApplication.run() 方法是整个启动流程的核心,本文将详细剖析其内部实现,帮助你深入理解 Spring Boot 的启动机制。

1. Spring Boot 启动的主要步骤

Spring Boot 的启动由 SpringApplication.run() 方法驱动,其核心代码如下:

SpringApplication.run(Application.class, args);

这个方法的运行过程可以分为以下主要步骤:

初始化 SpringApplication
确定应用类型(Servlet/Reactive/非 Web),加载环境和监听器。

准备运行环境
加载 application.propertiesapplication.yml 配置,解析命令行参数,准备 ConfigurableEnvironment

创建应用上下文
根据应用类型创建对应的 ApplicationContext,例如:

AnnotationConfigServletWebServerApplicationContext(Servlet 应用)ReactiveWebServerApplicationContext(Reactive 应用)

刷新上下文
完成 Bean 的加载、依赖注入、AOP 代理等操作,启动内嵌的 Web 服务器(如果需要)。

通知监听器和执行扩展点
触发生命周期事件,执行 CommandLineRunnerApplicationRunner

启动完成
应用准备好后,触发 ApplicationReadyEvent,正式进入运行状态。

2. 核心组件解析

2.1 环境准备

Spring Boot 通过 ConfigurableEnvironment 统一管理环境变量、配置文件、系统属性等信息。

加载顺序

  • 系统属性(如 -D 参数)。
  • 环境变量(System.getenv())。
  • 配置文件(application.propertiesapplication.yml)。
  • 命令行参数(args)。

扩展点
可以通过实现 EnvironmentPostProcessor 来自定义环境变量加载逻辑。

2.2 上下文创建

Spring Boot 根据应用类型选择合适的 ApplicationContext

应用类型上下文类型说明
Servlet 应用AnnotationConfigServletWebServerApplicationContext默认的 Web 应用上下文。
Reactive 应用ReactiveWebServerApplicationContext响应式编程应用上下文。
非 Web 应用GenericApplicationContext普通 Java 应用上下文。

上下文创建时,还会完成以下工作:

  • 注册基础组件,如 EnvironmentResourceLoader
  • 加载 Bean 定义,准备好应用的依赖图。

2.3 Bean 加载与初始化

扫描与加载
通过 @ComponentScan 扫描包路径,加载所有标注了 @Component@Service@Repository@Controller 等注解的类。

生命周期回调
初始化过程中,Spring 会调用以下接口或注解:

  • InitializingBeanafterPropertiesSet()
  • @PostConstruct 方法。

AOP 代理
根据 @EnableAspectJAutoProxy 自动为符合条件的 Bean 创建代理。

2.4 自动配置

Spring Boot 的 “魔法” 很大程度上来自于自动配置机制,通过 @EnableAutoConfiguration 实现。

实现原理
Spring Boot 使用 spring.factories 文件加载所有自动配置类。

核心类
@ConditionalOnClass@ConditionalOnProperty 等条件注解,控制是否加载自动配置。

扩展点
可以通过实现 AutoConfigurationImportFilter 自定义自动配置类的加载行为。

3. 生命周期事件

Spring Boot 在启动过程中会触发以下事件,开发者可以通过监听器进行自定义逻辑处理:

例如,监听 ApplicationReadyEvent

事件名称触发时机
ApplicationStartingEvent应用启动开始。
ApplicationEnvironmentPreparedEvent环境变量准备完成。
ApplicationPreparedEvent上下文准备完成但未刷新。
ApplicationStartedEvent上下文刷新完成。
ApplicationReadyEvent应用完全启动,准备好接收请求。
ApplicationFailedEvent启动失败。

例如,监听 ApplicationReadyEvent

@Component
public class MyApplicationReadyListener implements ApplicationListener<ApplicationReadyEvent> {
    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        System.out.println("Application is ready!");
    }
}

4. 启动异常处理机制

Spring Boot 使用 handleRunFailure 方法集中处理启动过程中的异常:

处理方式

  • 打印错误日志。
  • 调用注册的 SpringApplicationRunListenerfailed() 方法。
  • 关闭应用上下文,释放资源。

常见异常

  • BeanDefinitionStoreException:Bean 定义加载错误。
  • UnsatisfiedDependencyException:依赖注入失败。
  • IllegalStateException:上下文状态非法。

5. 总结

Spring Boot 的启动流程高度模块化,既有固定的主流程,又为开发者提供了丰富的扩展点。主要流程可总结为:

  • 准备阶段:初始化 SpringApplication,加载环境和监听器。
  • 上下文加载:创建 ApplicationContext,加载配置和 Bean 定义。
  • 上下文刷新:完成 Bean 的依赖注入和初始化,启动内嵌服务器。
  • 扩展与回调:通知监听器、调用 Runner 接口、触发生命周期事件。

通过理解 Spring Boot 启动流程,你可以更高效地调试问题、优化启动性能,甚至自定义启动行为,从而更好地掌控你的应用。

到此这篇关于Spring Boot 启动流程详解的文章就介绍到这了,更多相关Spring Boot 启动流程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java8 List集合如何移除满足条件的元素

    Java8 List集合如何移除满足条件的元素

    这篇文章主要介绍了Java8 List集合如何移除满足条件的元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • 浅谈Spring Session工作原理

    浅谈Spring Session工作原理

    Spring Session是为了解决多进程session共享的问题,本文将介绍怎么使用Spring Session,以及Spring Session工作原理
    2021-06-06
  • 基于JAVA中的四种JSON解析方式详解

    基于JAVA中的四种JSON解析方式详解

    这篇文章主要介绍了基于JAVA中的四种JSON解析方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • mybatis-plus实现打印完整sql语句

    mybatis-plus实现打印完整sql语句

    这篇文章主要介绍了mybatis-plus实现打印完整sql语句方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • MyBatis配置文件元素示例详解

    MyBatis配置文件元素示例详解

    在MyBatis框架的核心配置文件中,<configuration>元素是配置文件的根元素,其他元素都要在<contiguration>元素内配置,这篇文章主要介绍了MyBatis配置文件元素,需要的朋友可以参考下
    2023-06-06
  • java ThreadLocal使用案例详解

    java ThreadLocal使用案例详解

    这篇文章主要为大家详细介绍了java ThreadLocal的使用案例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • 使用java生成json时产生栈溢出错误问题及解决方案

    使用java生成json时产生栈溢出错误问题及解决方案

    这篇文章主要介绍了使用java生成json时产生栈溢出错误问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • springboot实现学生管理系统

    springboot实现学生管理系统

    这篇文章主要为大家详细介绍了springboot实现学生管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • Google Guava 缓存工具使用详解

    Google Guava 缓存工具使用详解

    这篇文章主要介绍了Guava自加载缓存LoadingCache使用指南,通过这些内容介绍,了解了LoadingCache的基本原理和用法,包括如何创建和配置缓存,以及如何结合Java 8的特性来优化代码,需要的朋友可以参考下
    2023-12-12
  • Java面向对象和内存分析图文详解

    Java面向对象和内存分析图文详解

    这篇文章主要给大家介绍了关于Java面向对象和内存分析的相关资料,文章可以让初学者顺利的分析内存,更加容易的体会程序执行过程中内存的变化,需要的朋友可以参考下
    2021-05-05

最新评论