完整SpringBoot生命周期流程图

1. 初始化 SpringApplication
   ├── 设置主类、推断应用类型(Web/非 Web)
   ├── 加载初始化器(ApplicationContextInitializer)和监听器(ApplicationListener)
   └── 加载 Bootstrapper 和事件监听器(通过 SPI 机制)

2. 准备环境(Environment)
   ├── 加载 `application.properties`/`application.yml` 配置文件
   ├── 解析命令行参数
   └── 构建 `ConfigurableEnvironment` 对象

3. 创建应用上下文(ApplicationContext)
   ├── 根据应用类型选择实现类(如 `AnnotationConfigServletWebServerApplicationContext`)
   └── 通过反射实例化上下文对象

4. 刷新应用上下文(Refresh Context)
   ├── 加载 Bean 定义
   │   ├── 扫描 `@Component``@Bean` 等注解类
   │   └── 解析配置类并注册 BeanDefinition
   ├── 调用 `BeanFactoryPostProcessor`
   │   ├── 修改 Bean 定义(如占位符替换)
   │   └── 处理 `@Configuration` 类
   ├── 注册 `BeanPostProcessor`
   │   ├── 如 `AutowiredAnnotationBeanPostProcessor`(处理 `@Autowired`)
   │   └── 如 `CommonAnnotationBeanPostProcessor`(处理 `@PostConstruct`)
   ├── 初始化单例 Bean
   │   ├── 实例化 Bean → **将工厂对象存入三级缓存(singletonFactories)**
   │   ├── 填充属性(依赖注入)
   │   │   ├── 若发生循环依赖 → **从三级缓存获取工厂生成早期引用(存入二级缓存)**
   │   │   └── 递归触发依赖 Bean 的初始化
   │   ├── 调用 Aware 接口(如 `BeanNameAware`)
   │   ├── `BeanPostProcessor.postProcessBeforeInitialization()`(如 AOP 代理)
   │   ├── 执行初始化方法(`@PostConstruct``InitializingBean`)
   │   └── `BeanPostProcessor.postProcessAfterInitialization()` → **存入一级缓存(singletonObjects)**
   └── 发布 `ContextRefreshedEvent` 事件

5. 启动内嵌服务器(Web 应用)
   ├── 创建 `WebServer`(如 Tomcat)并绑定端口
   └── 注册 `DispatcherServlet`

6. 调用 `CommandLineRunner``ApplicationRunner`
   ├── 按 `@Order` 优先级执行自定义启动逻辑
   └── 发布 `ApplicationReadyEvent`

7. 应用运行
   ├── 处理 HTTP 请求(通过 `DispatcherServlet`)
   └── 执行后台任务(如定时任务)

8. 接收关闭信号(如 `SIGTERM``SpringApplication.exit()`9. 发布 `ContextClosedEvent`

10. 销毁 Bean
    ├── 调用 `@PreDestroy` 方法
    └── 调用 `DisposableBean.destroy()`

11. 关闭内嵌服务器(释放端口)

以下是为Spring Boot启动流程各步骤增加的详细说明和解释(引用知识库内容增强说明):


1. 初始化 SpringApplication

  • 主类设置:记录启动类@SpringBootApplication标注的类,作为组件扫描的起点[[6]]。
  • 应用类型推断:通过类路径检测(如存在Tomcat依赖则标记为Web应用),决定使用AnnotationConfigServletWebServerApplicationContext等上下文实现[[10]]。
  • 初始化器加载:通过spring.factories机制加载ApplicationContextInitializer,用于在容器刷新前修改配置[[6]]。
  • 监听器注册:加载ApplicationListener实现类,统一由EventPublishingRunListener管理事件广播[[10]]。

2. 准备环境(Environment)

  • 配置文件加载:按优先级从classpath:/configclasspath:/、当前目录等位置加载application.properties/yml[[8]]。
  • 命令行参数绑定:将--key=value格式的参数转换为PropertySource,优先级高于文件配置[[8]]。
  • 环境对象构建:创建StandardServletEnvironment(Web应用),整合系统属性、环境变量、配置文件等属性源[[6]]。

3. 创建应用上下文

  • 上下文类型选择:根据应用类型选择AnnotationConfigServletWebServerApplicationContext(Web)或AnnotationConfigApplicationContext(非Web)[[10]]。
  • 反射实例化:通过无参构造函数创建上下文对象,初始化AnnotatedBeanDefinitionReaderClassPathBeanDefinitionScanner[[6]]。

4. 刷新应用上下文(核心阶段)

4.1 加载Bean定义
  • 组件扫描:从主类所在包递归扫描@Component@Service等注解类[[8]]。
  • 配置类解析:通过ConfigurationClassPostProcessor处理@Configuration类,注册@Bean方法为BeanDefinition[[10]]。
4.2 调用BeanFactoryPostProcessor
  • 占位符替换PropertySourcesPlaceholderConfigurer解析${}占位符,替换为环境变量值[[6]]。
  • 配置类增强:为@Configuration类生成CGLIB代理,确保@Bean方法在Spring上下文中执行[[10]]。
4.3 注册BeanPostProcessor
  • 依赖注入处理器:注册AutowiredAnnotationBeanPostProcessor处理@Autowired@Value[[6]]。
  • 生命周期处理器:注册CommonAnnotationBeanPostProcessor处理@PostConstruct@PreDestroy[[10]]。
4.4 初始化单例Bean
  • 三级缓存机制
    • 一级缓存(singletonObjects):存储完全初始化的Bean。
    • 二级缓存(earlySingletonObjects):存储早期暴露的Bean引用。
    • 三级缓存(singletonFactories):存储ObjectFactory,用于生成代理对象(解决AOP循环依赖)[[6]]。
  • 循环依赖处理:通过三级缓存提前暴露工厂对象,生成代理解决setter循环依赖[[10]]。
  • 初始化流程
    1. 实例化Bean(构造函数调用)。
    2. 填充属性(依赖注入,递归初始化依赖Bean)。
    3. 调用BeanNameAware等Aware接口。
    4. 执行BeanPostProcessor前置处理(如AOP代理)。
    5. 调用@PostConstructafterPropertiesSet()
    6. 执行BeanPostProcessor后置处理。
    7. 存入一级缓存[[6]][[10]]。
4.5 发布事件
  • ContextRefreshedEvent:通知监听器容器已刷新完成,常用于启动后台任务[[10]]。

5. 启动内嵌服务器(Web应用)

  • WebServer创建:通过TomcatServletWebServerFactory创建Tomcat实例,绑定配置的端口(支持SSL和随机端口)[[8]]。
  • DispatcherServlet注册:将Spring MVC前端控制器映射到/路径,处理所有HTTP请求[[10]]。

6. 调用Runner接口

  • 执行顺序:按@Order排序,ApplicationRunner优先于CommandLineRunner执行[[6]]。
  • 异常处理:任一Runner失败则终止应用启动,可通过try-catch捕获异常[[6]]。

7. 应用运行

  • 请求处理DispatcherServlet通过HandlerMapping查找控制器,HandlerAdapter执行方法,ViewResolver渲染视图[[10]]。
  • 定时任务:通过@Scheduled注解触发,由ScheduledTaskRegistrar管理线程池[[10]]。

8. 接收关闭信号

  • ShutdownHook注册:默认添加JVM关闭钩子,捕获SIGTERMSIGINT信号[[6]]。
  • 优雅关闭:停止接收新请求,等待活动请求完成(可配置超时时间)[[10]]。

9. 发布ContextClosedEvent

  • 事件触发:在销毁Bean前发布,用于释放数据库连接等资源[[10]]。

10. 销毁Bean

  • 销毁方法调用:按@PreDestroyDisposableBean.destroy() → 自定义destroy-method顺序执行[[6]]。

11. 关闭内嵌服务器

  • 资源释放:关闭Tomcat/Jetty服务器,释放端口和连接池资源[[8]]。

### Spring Boot 自动配置流程解析 #### 一、自动配置概述 Spring Boot 的自动配置功能旨在简化应用程序开发过程中繁琐的手动配置工作。通过使用注解,可以实现对常见组件和服务的自动化设置,从而减少 XML 配置文件的工作量并加速项目的启动过程[^3]。 #### 二、自动配置的关键要素 1. **@EnableAutoConfiguration 注解** 应用程序入口类通常会带有 `@EnableAutoConfiguration` 或其变体(如 `@SpringBootApplication`),这标志着开启了自动配置的支持。该注解允许框架扫描特定路径下的元数据,并据此推断出哪些 Bean 可以被创建以及如何初始化它们[^4]。 2. **META-INF/spring.factories 文件** 这是一个特殊的资源文件,位于 JAR 包内的 META-INF 目录下。它定义了一系列接口及其对应的实现类列表。当应用启动时,JVM 将利用 SPI (Service Provider Interface) 加载这些信息,进而触发相应的自动装配逻辑[^5]。 #### 三、具体执行步骤 以下是 Spring Boot 启动期间进行自动配置的主要阶段: - **读取 spring.factories 中的内容**:系统遍历 classpath 下所有的 jar 文件,寻找名为 "spring.factories" 的属性文件;对于每一个找到的目标文件,都会将其内容加载至内存中以便后续处理。 - **解析 Configuration 类**:根据上述获取的数据集,识别出所有标记有 @Configuration 的 JavaConfig 类型对象实例化计划表单——即待激活状态下的候选者集合。 - **条件评估与过滤**:针对每一种可能的选择项实施细粒度级别的检验操作,只有满足预设前提条件的对象才会真正意义上成为最终入选名单的一员。此环节涉及到多种类型的 Condition 接口的应用场景,比如 OnClassCondition、OnPropertyCondition 等等。 - **注册 Beans 到上下文中**:一旦确定下来具体的配置方案之后,则按照既定规则向 IoC 容器内添加必要的服务提供方实体记录条目,确保整个生命周期管理链条得以顺利建立起来。 ```mermaid graph TD; A[启动 Spring Boot 应用] --> B{查找 spring.factories}; B --> C[定位到 spring-boot-autoconfigure]; C --> D[解析 Configuration Classes]; D --> E{评估 Conditions}; E -- True --> F[注册符合条件的 Beans]; E -- False --> G[跳过不符合条件的 Beans]; F --> H(完成自动配置); G --> H; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值