让 Spring Boot 应用启动更快

Posted

技术标签:

【中文标题】让 Spring Boot 应用启动更快【英文标题】:Make Spring boot application Startup Faster 【发布时间】:2020-05-22 11:10:37 【问题描述】:

spring-boot中有两个IOC容器:BeanFactoryApplicationContext

据我了解,ApplicationContext 支持 bean 的急切初始化,而 BeanFactory 懒惰地进行初始化。

问题说明: 在我的 Spring boot 应用程序中,我想使用 bean 的延迟初始化来使应用程序启动更快。任何人都可以提出实现相同目标的解决方案吗?

【问题讨论】:

【参考方案1】:

关于 Aniket Sahrawat 的解释答案:spring.main.lazy-initialization=true

延迟初始化的影响

在整个应用程序中启用延迟初始化可能会产生积极和消极的影响。

让我们谈谈其中的一些,因为它们在新功能的官方公告中有所描述:

    延迟初始化可能会减少在 应用程序正在启动——因此,我们可以改善启动时间 应用程序 由于在需要之前不会创建任何 bean,我们可以 掩盖问题,让它们在运行时而不是启动时出现 问题可能包括内存不足错误、配置错误或 类定义发现错误 此外,当我们在 Web 上下文中时,触发 bean 创建 需求会增加HTTP请求的延迟——bean 创建只会影响第一个请求,但这可能有 对负载平衡和自动扩缩产生负面影响。

参考:https://www.baeldung.com/spring-boot-lazy-initialization#effects

【讨论】:

更多信息:spring.io/blog/2019/03/14/…【参考方案2】:

使用延迟初始化属性:

spring.main.lazy-initialization=true

该属性仅在 spring boot 2.2 及以上版本中支持。如果版本低于 2.2,您将需要写一个BeanFactoryPostProcessor。该属性将确保依赖项在需要时才被注入,主要的时间差异可以在执行热重启时看到。

FYI ApplicationContext 是一个 BeanFactory,两者都支持惰性初始化。这实际上取决于何时调用 BeanFactory#getBeanProvider

【讨论】:

此属性是否会使应用程序将 IOC 容器用作“BeanFactory”? 你能补充一些解释吗? 它将使用ApplicationContext。 App Context 继承自 BeanFactory,增强它。默认情况下,它将在启动时加载所有 bean。当然,您可以通过编程方式设置 BF,但我建议在生产中使用 AC 而不要延迟加载,因此您会在加载时看到 bean 创建异常。在开发模式下,您可以使用 Aniket 向您建议的属性,因此启动时间会减少。

以上是关于让 Spring Boot 应用启动更快的主要内容,如果未能解决你的问题,请参考以下文章

spring boot注解及启动过程

在启动 Spring Boot 应用程序时获取为 MethodArgumentNotValidException 映射的不明确的 @ExceptionHandler 方法

将初始数据导入 Spring Boot 应用程序

Spring Boot 入门

161103Spring Boot 入门

春季启动黄瓜测试