SpringBoot启动太慢的7个优化技巧

 更新时间:2025年12月25日 09:39:27   作者:Java编程爱好者  
项目越做越大,SpringBoot启动时间从几秒变成了30多秒,改一行代码等半分钟,效率太低了,今天分享7个优化技巧,亲测有效,大家可以根据需要进行选择

SpringBoot启动太慢?几个优化技巧

项目越做越大,SpringBoot启动时间从几秒变成了30多秒。

改一行代码等半分钟,效率太低了。今天分享几个优化技巧,亲测有效。

先找到慢在哪

优化之前,先看看时间花在哪了。

SpringBoot 2.4以上可以开启启动分析:

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(Application.class);
        app.setApplicationStartup(new BufferingApplicationStartup(2048));
        app.run(args);
    }
}

启动后访问/actuator/startup就能看到每个步骤的耗时。

常见的耗时大户:

  • 包扫描范围太大
  • 自动配置太多
  • 数据源初始化
  • MyBatis Mapper扫描

优化1:缩小包扫描范围

// 优化前:扫描整个包
@SpringBootApplication
public class Application {}

// 优化后:只扫描需要的包
@SpringBootApplication(scanBasePackages = {
    "com.example.controller",
    "com.example.service",
    "com.example.config"
})
public class Application {}

包越少,扫描越快。

优化2:排除不需要的自动配置

SpringBoot会自动配置很多东西,但不是都用得上:

@SpringBootApplication(exclude = {
    DataSourceAutoConfiguration.class,  // 不用数据库时
    RedisAutoConfiguration.class,        // 不用Redis时
    MongoAutoConfiguration.class,        // 不用MongoDB时
})
public class Application {}

或者在配置文件里排除:

spring:
  autoconfigure:
    exclude:
      - org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

优化3:延迟初始化

spring:
  main:
    lazy-initialization: true

Bean在第一次使用时才初始化,不是启动时全部初始化。

注意:  第一次请求会变慢,生产环境慎用,开发环境很适合。

优化4:优化MyBatis配置

mybatis:
  configuration:
    lazy-loading-enabled: true
  mapper-locations: classpath:mapper/*.xml  # 精确指定,不要用**

Mapper接口用@Mapper注解代替包扫描:

// 不推荐
@MapperScan("com.example")

// 推荐
@Mapper
public interface UserMapper {}

优化5:关闭开发环境不需要的功能

spring:
  profiles:
    active: dev

---
spring:
  config:
    activate:
      on-profile: dev
      
# 开发环境关闭一些功能
springdoc:
  api-docs:
    enabled: false

management:
  endpoint:
    health:
      show-details: never

优化6:JVM参数

开发环境追求启动快,可以加这些参数:

java -XX:TieredStopAtLevel=1 \
     -noverify \
     -Dspring.jmx.enabled=false \
     -jar app.jar
  • -XX:TieredStopAtLevel=1 只用C1编译,启动更快
  • -noverify 跳过字节码验证
  • -Dspring.jmx.enabled=false 关闭JMX

大约能提升20%左右。

优化7:使用DevTools热重载

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
</dependency>

改代码后不用完全重启,只重新加载变化的部分,几秒就能生效。

优化效果

优化项优化前优化后
缩小包扫描30s27s
排除自动配置27s20s
延迟初始化20s12s
JVM参数12s10s
DevTools10s3s

从30秒到3秒,效率提升10倍。

开发vs生产

开发环境:  追求启动快

spring:
  main:
    lazy-initialization: true

生产环境:  追求运行时性能

spring:
  main:
    lazy-initialization: false

可以用不同的配置文件区分。

远程调试

有时候需要连测试环境的数据库调试,本地配置改成测试环境的地址就行:

spring:
  datasource:
    url: jdbc:mysql://测试环境IP:3306/testdb

把本地电脑和测试环境连起来,配置文件写虚拟IP就能直接连,不用部署到服务器上调试,启动优化效果也能立刻验证。

小结

启动优化的核心思路:少加载、晚加载

  • 缩小包扫描范围
  • 排除不需要的自动配置
  • 延迟初始化(开发环境)
  • 用DevTools热重载
  • JVM用快速启动参数

先从最简单的开始试,效果立竿见影。

到此这篇关于SpringBoot启动太慢的7个优化技巧的文章就介绍到这了,更多相关SpringBoot启动优化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于Mybatis实现动态数据源切换的示例代码

    基于Mybatis实现动态数据源切换的示例代码

    在当今的互联网应用中,微服务大行其道,随着业务的发展和扩展,单一的数据库无法满足日益增长的数据需求,本文将基于 JDK17 + Spring Boot 3 和 MyBatis 框架实现动态切换数据源功能,需要的朋友可以参考下
    2024-09-09
  • SpringCloud实现文件上传功能的方法详解

    SpringCloud实现文件上传功能的方法详解

    这篇文章主要为大家详细介绍了SpringCloud如何实现文件上传功能,文中的示例代码讲解详细,对我们学习有一定的借鉴价值,需要的可以参考一下
    2022-08-08
  • SpringBoot实现excel生成并且通过邮件发送的步骤详解

    SpringBoot实现excel生成并且通过邮件发送的步骤详解

    实际开发中,特别是在B端产品的开发中,我们经常会遇到导出excel的功能,更进阶一点的需要我们定期生成统计报表,然后通过邮箱发送给指定的人员, 今天要带大家来实现的就是excel生成并通过邮件发送,需要的朋友可以参考下
    2023-10-10
  • javaSE类和对象进阶用法举例详解

    javaSE类和对象进阶用法举例详解

    JavaSE的面向对象编程是软件开发中的基石,它通过类和对象的概念,实现了代码的模块化、可复用性和灵活性,这篇文章主要介绍了javaSE类和对象进阶用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-08-08
  • 聊聊MultipartFile与File的一些事儿

    聊聊MultipartFile与File的一些事儿

    这篇文章主要介绍了MultipartFile与File的一些事儿,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java枚举类用法实例

    Java枚举类用法实例

    这篇文章主要介绍了Java枚举类用法,实例分析了java中枚举类的实现与使用技巧,需要的朋友可以参考下
    2015-05-05
  • SpringBoot+slf4j实现全链路调用日志跟踪的方法(一)

    SpringBoot+slf4j实现全链路调用日志跟踪的方法(一)

    本文重点给大家介绍Tracer集成的slf4j MDC功能,方便用户在只简单修改日志配置文件的前提下输出当前 Tracer 上下文 TraceId,文章通过代码给大家讲解了在springboot中使用的技巧,感兴趣的朋友跟随小编一起看看吧
    2021-05-05
  • 基于JavaSwing设计和实现的酒店管理系统

    基于JavaSwing设计和实现的酒店管理系统

    这篇文章主要介绍了基于JavaSwing+mysql的酒店管理系统设计和实现,它可以实现酒店日常的管理功能包括开房、退房、房间信息、顾客信息管理等
    2021-08-08
  • java局域网聊天小程序

    java局域网聊天小程序

    这篇文章主要为大家详细介绍了java局域网聊天小程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • Java反射机制详解_动力节点Java学院整理

    Java反射机制详解_动力节点Java学院整理

    这篇文章主要为大家详细介绍了Java反射机制的相关资料,主要包括反射的概念、作用
    2017-06-06

最新评论