spring boot 4.4启动慢需先启用bufferingapplicationstartup和/actuator/startup端点,再通过json报告定位spring.beans.instantiate等超300ms事件,结合排除无用自动配置、收缩@componentscan范围、开启spring.main.lazy-initialization=true三步优化。

你的 Spring Boot 4.4 应用启动仍需 8 秒以上?控制台日志滚动缓慢、本地开发频繁等待、CI/CD 流水线卡在启动阶段——这不是配置问题,而是启动流程中存在未被识别的耗时环节,必须逐层拆解时间流向才能定位真因。
启用 Startup 耗时追踪端点
Spring Boot 4.4 内置 ApplicationStartup 机制,默认关闭。必须显式启用 BufferingApplicationStartup 并暴露 /startup 端点,否则所有优化都无从验证。
在主启动类中,【必须在 SpringApplication.run() 调用前设置】:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(Application.class);
app.setApplicationStartup(new BufferingApplicationStartup(4096));
app.run(args);
}
}
添加 actuator 依赖(Spring Boot 4.4 已将 actuator 模块升级为 spring-boot-starter-actuator-core):
配置 application.yml,确保 startup 端点可访问:
management:
endpoint:
startup:
show-details: always
endpoints:
web:
exposure:
include: "health,info,startup"
分析 Startup 报告定位瓶颈
启动应用后,直接访问 http://localhost:8080/actuator/startup(默认端口),返回 JSON 格式事件流。重点关注 duration 字段超过 300ms 的 event.name。
常见高耗时事件及对应根因:
• spring.beans.instantiate:某 Bean 构造器或 @PostConstruct 中执行了阻塞 IO(如读取大文件、调用未 mock 的远程服务);
• spring.context.bootstrap-context:refresh:自动配置类条件匹配(@ConditionalOnClass)触发大量 ClassLoader.loadClass 反射调用;
• spring.boot.autoconfigure:load:加载了未使用的 starter 导致 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 解析膨胀;
• spring.context.annotation:scan:@ComponentScan 扫描路径包含 test/ 或 tools/ 子包,导致数千个无关类被解析为候选组件。
注意:若 report 中出现多个 “spring.beans.instantiate” 连续耗时超 500ms,说明存在未加 @Lazy 的重量级 Bean,需立即处理。
三步落地优化策略
第一步:排除无用自动配置
运行应用时追加 --debug 参数,查看控制台输出的 Auto-configurations Report。扫描 Negative matches 区域,找出“did not match”的配置类(如 RedisAutoConfiguration、MailSenderAutoConfiguration),它们虽未生效,但仍参与了条件评估。
在 @SpringBootApplication 中显式排除:
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class,
RedisAutoConfiguration.class,
ElasticsearchRestClientAutoConfiguration.class
})
第二步:收缩组件扫描范围
默认 @SpringBootApplication 会扫描启动类所在包及其全部子包。若项目结构为 com.example.project,但实际业务仅在 com.example.project.service 和 com.example.project.controller 下,必须显式限定:
@SpringBootApplication(scanBasePackages = {"com.example.project.service", "com.example.project.controller"})
第三步:开启全局懒加载
Spring Boot 4.4 默认关闭懒加载。在 application.yml 中添加:
spring:
main:
lazy-initialization: true
该配置使所有非 @Lazy(false) 或 @Primary 的 Bean 延迟到首次注入时才初始化,可规避 60% 以上的启动期 Bean 实例化开销。
验证优化效果
重启应用,再次访问 /actuator/startup,对比 timeline.events 中各事件 duration 总和。若总启动时间未下降,检查是否遗漏了以下关键项:
• 是否在测试环境误启了 devtools,其 RestartClassLoader 会显著拖慢类加载;
• pom.xml 中是否存在 scope=runtime 的依赖(如 log4j-to-slf4j),它们仍参与启动期类路径扫描;
• 是否有自定义 ApplicationContextInitializer 在 refresh 前执行了耗时逻辑。
执行 mvn clean compile 后重新打包 jar,用 java -jar 启动,确认无 IDE 插件干扰。











