最小化Spring Boot启动时间

在我看来,SpringBoot项目需要很长时间才能加载。 这可能是因为SpringBoot正在为您配置组件,其中一些甚至可能不需要。 最明显的做法是从类路径中删除不必要的依赖项。 但是,这还不够。

有没有办法找出SpringBoot正在配置哪些模块来挑选你不需要的东西并禁用它们?

还有什么办法可以加快SpringBoot应用程序的启动时间吗?

我可以告诉你,我通过Spring MVC,JMS,Atomikos事务,Hibernate,JMX支持和嵌入式Tomcat使用restful webservices运行大型(800,000多行代码)应用程序。 尽管如此,应用程序将在大约19秒内在我的本地桌面上启动。

Spring Boot努力不配置您不使用的模块。 但是,很容易引入您不想要的其他依赖项和配置。

请记住,Spring Boot遵循约定优于配置范例,只需在类路径中放置库就可以使Spring Boot尝试配置模块以使用库。 此外,通过使用@RestController注释类的简单操作将触发Spring Boot自动配置整个Spring MVC堆栈。

您可以看到正在进行的操作,并启用调试日志记录,就像从命令行启动应用程序时指定--debug一样简单。 您还可以在application.properties中指定debug = true。

此外,您可以在application.properties设置日志记录级别,如下所示:

 logging.level.org.springframework.web: DEBUG logging.level.org.hibernate: ERROR 

如果检测到您不想要的自动配置模块,则可以禁用它。 可以在此处找到相关文档: http : //docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#using-boot-disabling-specific-auto-configuration

一个例子如下:

 @Configuration @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}) public class MyConfiguration { } 

一些可能有用的其他提示。

  • 使用OpenJ9而不是Hotspot进行开发
  • 如果使用Hibernate,请设置hibernate.ddl-auto=none而不是update
  • 将vmargs设置为-Xquickstart
  • 如果您使用OpenJ9 – 将vmargs设置为-XX:TieredStopAtLevel=1 -noverify
  • 如果使用Hotspot – 使用IDE构建而不是Gradle构建
  • 使用Undertow而不是Tomcat
  • 不要滥用注释处理工具(mapstruct,immutables ……),这将减慢构建过程

此外:

本文建议对本地开发环境使用@ComponentScan(lazyInit = true)

TL; DR

我们想要实现的是仅在本地开发环境中启用bean延迟加载,并为生产留下急切的初始化。 他们说你不能吃蛋糕也不能吃,但spring你真的可以。 都要感谢个人资料。

 @SpringBootApplication public class LazyApplication { public static void main(String[] args) { SpringApplication.run(LazyApplication.class, args); } @Configuration @Profile("local") @ComponentScan(lazyInit = true) static class LocalConfig { } }