最小化弹簧启动启动时间

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

有没有办法找出SpringBoot正在配置哪些模块,以便您挑选出不需要的内容并禁用它们?

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


答案 1

我可以告诉你,我运行一个大型(800,000多行代码)应用程序,通过Spring MVC,JMS,Atomikos事务,Hibernate,JMX支持和嵌入式Tomcat使用宁静的Web服务。完成所有这些,应用程序将在大约19秒内在我的本地桌面上启动。

Spring Boot 尽量不配置您未使用的模块。但是,很容易引入您不希望的其他依赖项和配置。

请记住,Spring Boot 遵循配置范例的约定,并且只需在类路径中放置一个库,就可能导致 Spring Boot 尝试将模块配置为使用该库。此外,通过执行一些简单的事情,例如使用@RestController注释您的类将触发Spring Boot以自动配置整个Spring MVC堆栈。

您可以查看幕后发生的事情,并启用调试日志记录,就像从命令行启动应用程序时指定一样简单。还可以在 application.properties 中指定 debug=true。--debug

此外,您可以简单设置日志记录级别,如下所示: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 {
}

答案 2

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

另外:

正如本文所建议的那样,建议用于本地开发环境。@ComponentScan(lazyInit = true)

TL;DR

我们想要实现的是仅在本地开发环境中启用 Bean 延迟加载,并将急切的初始化留给生产环境。他们说你不能吃你的蛋糕,也吃它,但有了春天,你实际上可以。这一切都要归功于个人资料。

@SpringBootApplication
public class LazyApplication {

    public static void main(String[] args) {
        SpringApplication.run(LazyApplication.class, args);
    }

    @Configuration
    @Profile("local")
    @ComponentScan(lazyInit = true)
    static class LocalConfig {
    }

}

推荐