【碎片化学习】SpringBoot服务的启动过程
Spring Boot 服务的启动过程大致可以分为以下几个阶段,每个阶段负责不同的初始化和配置工作。以下是 Spring Boot 启动过程的详细描述:
1. 启动阶段(Application启动)
启动方式: SpringApplication.run(Application.class, args);
处理逻辑:
Spring Boot 会初始化一个 SpringApplication 实例并设置相关的配置信息。
启动过程中,会创建 ApplicationContext(Spring 容器)并加载所需的 bean 定义和配置文件。
初始化 Spring Boot 特有的自动配置模块,处理应用的环境配置(如 application.properties 或 application.yml)。
2. 环境准备阶段(Environment Preparation)
处理逻辑:
Spring Boot 会根据命令行参数、系统环境变量、配置文件等来构建应用环境。
启动时会创建 ConfigurableEnvironment,并加载各种配置信息(如数据库、日志配置等)。
处理配置文件的 @Value 注解绑定,激活与环境相关的配置类。
3. Spring Context 初始化(Application Context Initialization)
处理逻辑:
创建并初始化 Spring 容器(ApplicationContext),它是 Spring 容器的核心。
加载所有的 bean 定义,扫描并解析标注了 @Component、@Service、@Repository 等注解的类。
解析 @Configuration 配置类,并在其中注册 bean。
启动自动配置模块,通过 @EnableAutoConfiguration 注解触发自动化配置。
4. 自动配置与 Bean 定义加载(AutoConfiguration & Bean Definitions)
处理逻辑:
根据项目依赖,Spring Boot 会自动配置数据库、Web 服务器、消息队列等服务。
自动配置模块会扫描当前类路径中的类(例如数据库驱动、Web 框架等),并根据已加载的配置文件自动启用相关配置。
通过 @ConditionalOnClass、@ConditionalOnMissingBean 等注解判断是否加载某些自动配置类。
5. Bean 初始化(Bean Initialization)
处理逻辑:
所有的 Spring Bean 被实例化并注入到 Spring 容器中。
启动时,@PostConstruct 注解标注的初始化方法会被调用。
如果定义了 CommandLineRunner 或 ApplicationRunner,它们会在 Bean 初始化后被执行,通常用于进行初始化操作或处理启动时的特定任务。
6. Web 服务器初始化(Web Server Initialization)
处理逻辑:
如果是 Web 应用,Spring Boot 会自动嵌入一个 Web 服务器(如 Tomcat、Jetty 或 Undertow)。
它会启动内嵌的 Servlet 容器,并加载与 Web 相关的配置(如 DispatcherServlet、Filter、Listener 等)。
启动时,会初始化 Spring MVC,设置路由、控制器、视图解析器等。
7. 应用启动(Application Startup)
处理逻辑:
启动 Web 服务,如果是 Spring MVC 应用,它会初始化并映射所有控制器和路由。
对于非 Web 应用,Spring Boot 会执行 run() 方法中的最后操作,进行应用的启动和健康检查。
Spring Boot 会等待客户端的请求。
8. 关闭钩子与清理(Shutdown Hook & Cleanup)
处理逻辑:
Spring Boot 启动时会注册一个 JVM 关闭钩子,当程序退出时,钩子会触发进行资源的清理。
此时 Spring 容器会调用 @PreDestroy 注解的销毁方法,并销毁所有的 bean。
总结:
Spring Boot 启动过程是一个多阶段的初始化过程,从环境准备到 Web 服务器启动,最后到应用的运行和关闭。每个阶段都承担不同的任务,如加载配置、创建和初始化 Spring 容器、自动配置、初始化 Web 服务器等。