最小化Spring Boot启动时间

36

我认为SpringBoot项目需要很长时间才能加载。这可能是因为SpringBoot为您配置组件,其中一些组件您甚至不需要。

最明显的做法是从类路径中删除不必要的依赖项。然而,仅此还不够。

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

除了从类路径中删除不必要的依赖项外,还有其他方法可以加快SpringBoot应用程序的启动时间吗?


一个可能会有用的链接:http://spring.io/blog/2018/12/12/how-fast-is-spring - Marged
2个回答

46

我可以告诉你,我运行了一个大型(800,000+行代码)的应用程序,使用Spring MVC、JMS、Atomikos事务、Hibernate、JMX支持和嵌入式Tomcat通过restful webservice。尽管如此,该应用程序在我的本地桌面上启动时间约为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 {
}

3
截至2022年,与.NET、Python相比,仍然很慢,即使是一个简单的“Hello World”程序也像是回到了90年代。 - Ed_

16

以下是一些可能有帮助的额外提示:

此外:

正如这篇文章所推荐的,在本地开发环境中使用 @ComponentScan(lazyInit = true)

简而言之:

我们想要实现的目标是仅在本地开发环境中启用 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 {
    }

}

3
-noverify 在 JDK 13 中已被弃用,并且可能会在未来的版本中被移除。 - WirJun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接