【问题标题】:Why does `SpringApplication.run` not create the beans lazily?为什么`SpringApplication.run`不懒惰地创建bean?
【发布时间】:2021-01-08 18:22:57
【问题描述】:

如果您在项目中定义了具有单例范围的组件类,并且在您的 main() 中除了调出应用程序上下文之外什么都不做,例如:

ConfigurableApplicationContext context = SpringBootApplication.run(MyMainClass.class, args)

context 将已经指向包含这些类的单例实例的ApplicationContext。因此,无论您输入多少次context.getBean(MyContainerClass.class),您都会得到相同的MyContainerClass 实例。

但是该对象的创建可能非常繁重,甚至依赖于运行时约束(数据库连接、网络套接字管理、工作)。我知道重载构造函数不是很好的编程习惯,但是,即使在 POJO 中,它也可能发生。

我想知道是否有一种特殊的逻辑可以在创建上下文时立即创建单例,而不是第一次调用 getBean()。也许 SpringBoot 给程序员的合同说:“如果你用 @Component 注释了一个类,你真的应该在某个时候检索 bean:我假设你知道这一点并且愿意在正在提出上下文。”也许不吧。不确定。

【问题讨论】:

标签: java spring-boot inversion-of-control applicationcontext spring-bean


【解决方案1】:

实际上 Spring Boot (2.3.3) 可以延迟加载 @Beans。只需将以下属性添加到您的 application.properties 文件中。初始化应该延迟执行。

spring.main.lazy-initialization = true

在整个应用程序中启用延迟初始化可能会产生积极和消极的影响。查看Baeldung描述的延迟初始化的效果:

  1. 延迟初始化可能会减少应用程序启动时创建的 bean 数量——因此,我们可以提高应用程序的启动时间

  2. 由于在需要它们之前不会创建任何 bean,我们可以掩盖问题,让它们在运行时而不是启动时

  3. 问题可能包括内存不足错误、配置错误或类定义发现错误

  4. 此外,当我们在 Web 上下文中时,按需触发 bean 创建会增加 HTTP 请求的延迟 - bean 创建只会影响第一个请求,但这可能会对负载平衡和自动产生负面影响-缩放。

【讨论】:

  • Baeldung 确实是一个很好的资源。谢谢。
猜你喜欢
  • 2015-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多