惰性 bean 初始化有什么真正的缺点吗?

问题描述 投票:0回答:2

最近我开始在 spring 中大量使用的延迟初始化功能。所以我一直在徘徊 - 延迟初始化你的 beans 有什么实际的缺点吗?如果不是 - 为什么默认行为不是懒惰?

java spring lazy-initialization
2个回答
8
投票

主要的“缺点”是不能立即发现配置问题。如果您有一个仅“偶尔”使用的 bean,并且该 bean 配置错误,则您的应用程序可能会在生产环境中运行几天,然后才会使用该 bean 并引发错误。在启动时了解这个问题会好得多。

此外,通常更希望在启动时而不是在使用期间支付初始化成本(即性能、时间延迟等)。例如,在 Web 应用程序中,您需要在启动时初始化 Bean 的成本,而不是在客户第一次使用您的购物车时(等待购物车 Bean 进行首次初始化)以及在她结账时再次初始化的成本,然后在处理付款时再次进行,等等

这些是一些原因。

[编辑]

附注来自 Spring 参考指南部分 6.4.4 延迟初始化 beans

默认情况下,ApplicationContext 实现会在初始化过程中急切地创建和配置所有单例 bean。一般来说,这种预实例化是可取的,因为配置或周围环境中的错误会立即被发现,而不是数小时甚至数天后。如果不需要这种行为,您可以通过将 Bean 定义标记为延迟初始化来防止预实例化单例 Bean。惰性初始化的 bean 告诉 IoC 容器在第一次请求时创建一个 bean 实例,而不是在启动时。


0
投票

我们今天才发现的事情,如果您的 bean 方法之一具有 @KafkaListener 注释(在其他框架中可能存在此问题的变体),并且您将 bean 设置为 @Lazy 以避免与与此 bean 关联的另一个 bean 进行循环引用,否则没有其他对这些 bean 的引用,那么该 bean 将永远不会被实例化,并且 Kafka 侦听器方法将永远不会激活,也不会触发可用的消息。

© www.soinside.com 2019 - 2024. All rights reserved.