最小化Spring Boot启动时间

Sam*_*nia 26 java optimization spring startup spring-boot

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

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

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

pcz*_*eus 37

我可以告诉你,我运行了一个大型(800,000多行代码)应用程序,通过Spring MVC,JMS,Atomikos事务,Hibernate,JMX支持和嵌入式Tomcat使用restful webservices.有了这些,应用程序将在大约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
Run Code Online (Sandbox Code Playgroud)

如果检测到您不想要的自动配置模块,则可以禁用它.可以在此处找到相关文档: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 {
}
Run Code Online (Sandbox Code Playgroud)

  • 截至 2022 年,速度仍然很慢(与 .NET、Python 相比),即使是 hello world 程序也是 90 年代的倒退 (3认同)

Mik*_*kov 7

一些其他提示可能会有所帮助。

此外:

本文所述,建议@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 {
    }

}
Run Code Online (Sandbox Code Playgroud)

  • `-noverify` 在 JDK 13 中已弃用,并且可能会在未来版本中删除 (2认同)