当前位置: 首页 > news >正文

SpringBoot 启动优化 问题

Spring Boot 核心机制解析

一、自动配置实现原理

1. 核心注解机制

  • @SpringBootApplication 是组合注解,包含三个核心注解:
    • @SpringBootConfiguration:标识为配置类
    • @EnableAutoConfiguration:启用自动配置的核心开关
    • @ComponentScan:启用组件扫描

2. 自动配置触发流程

  1. @EnableAutoConfiguration 通过 @Import 导入 AutoConfigurationImportSelector
  2. 该选择器从类路径下所有 META-INF/spring.factories 文件中读取配置
  3. 查找键为 org.springframework.boot.autoconfigure.EnableAutoConfiguration 的配置项
  4. 加载所有列出的自动配置类(全限定名)

3. 配置过滤与生效

  • 通过条件注解(如 @ConditionalOnClass)进行筛选
  • 仅当满足条件时才会实际加载配置类
  • 示例:DataSourceAutoConfiguration
    • 触发条件:存在 spring-boot-starter-jdbc 依赖
    • 根据 application.properties/yml 生成数据源Bean
    • 开发者自定义Bean会通过 @ConditionalOnMissingBean 被优先采用

二、应用启动优化策略

1. 启动加速方案

  • 依赖精简

    • 移除非必要依赖(如测试专用的模拟支付依赖)
    • 减少类加载数量
  • 延迟初始化

    • 使用 @Lazy 注解标记非紧急Bean(如订单状态机)
    • 将复杂初始化延迟到首次使用时
  • 异步初始化

    • 通过 @Async 将耗时操作移至后台线程
    • 避免阻塞主线程启动过程

2. 配置加载优化

  • 顺序控制
    • 确保基础配置(如数据库)先于业务配置(如支付)加载
    • 通过 PropertySource 明确指定加载顺序

3. Bean初始化控制

  • 显式依赖声明

    • 使用 @DependsOn 明确指定依赖关系
    • 示例:支付服务依赖支付客户端初始化
  • 配置类顺序控制

    • @Configuration 类中按依赖顺序定义Bean

三、循环依赖解决机制

三级缓存工作流程

缓存层级名称存储内容
一级singletonObjects完全初始化的Bean
二级earlySingletonObjects未完成初始化的早期引用
三级singletonFactories生成早期引用的ObjectFactory

解决示例(Bean A ↔ Bean B)

  1. 创建A实例 → 存入三级缓存
  2. A注入B依赖 → 触发B创建
  3. 创建B实例 → 存入三级缓存
  4. B注入A依赖 → 从三级缓存获取A的早期引用
  5. B完成初始化 → 移入一级缓存
  6. A完成初始化 → 移入一级缓存

使用限制

  • 作用域限制:仅支持单例Bean
  • 注入方式限制:不支持构造器注入方式

四、Spring Bean生命周期

完整生命周期阶段

  1. 实例化:通过构造器/工厂方法创建对象实例
  2. 属性赋值:完成依赖注入和属性填充
  3. 初始化前:执行 BeanPostProcessor.postProcessBeforeInitialization
  4. 初始化:触发 @PostConstructInitializingBean.afterPropertiesSet
  5. 初始化后:执行 BeanPostProcessor.postProcessAfterInitialization
  6. 使用期:Bean处于就绪状态
  7. 销毁前:触发 @PreDestroyDisposableBean.destroy
  8. 销毁:实例被垃圾回收

生命周期管理价值

  • 确保资源按正确顺序初始化和释放
  • 提供扩展点实现定制化处理
  • 维持应用上下文的稳定状态

相关文章:

  • 什么是Java序列化?什么情况下需要使用序列化
  • 5. 实现一个中间件
  • S7-1200对V90 PN进行位置控制的三种方法
  • 新能源行业:卓越 UE/UI 设计,引领业务腾飞的新引擎
  • 23种设计模式-命令(Command)设计模式
  • 数据文件误删除,OceanBase中如何重建受影响的节点
  • Axure设计之中继器表格——拖动行排序教程(中继器)
  • 重庆软航NTKO WebOffice控件在谷歌Chrome 133版提示扩展已停用解决方案!
  • 26考研——图_图的应用(6)
  • 如何使用DeepSeek编写测试用例?
  • SCI一区 | Matlab实现DBO-TCN-LSTM-Attention多变量时间序列预测
  • 搭建Redis哨兵集群
  • 安装DNS(BIND)并部署主域服务
  • 为什么要将项目部署到外部tomcat
  • 【第13届蓝桥杯C/C++B组省赛】顺子日期
  • Brainstorm绘制功能连接图(matlab)
  • Leetcode—242. 有效的字母异位词(字符串算法)
  • 国内 npm 镜像源推荐
  • TCP/IP 协议族详细知识点清单
  • 计算机网络--传输层(1)
  • 怎样建网站联系方式/百度一下打开网页
  • 网站建设 百度文库/许昌网络推广公司
  • 一 网站开发背景/策划公司是做什么的
  • iis建立好网站 怎么打开/网络营销师是做什么的
  • 做网站服务器多钱/指数基金怎么买才赚钱
  • 织梦网站专题页面如何做/有没有免费的crm系统软件