最近我开始使用spring中的惰性初始化特性 * 很多 *。所以我一直在想--懒惰地初始化bean有什么实际的缺点吗?如果不是,为什么懒惰不是默认行为?
zzlelutf1#
主要的“缺点”是不能立即捕获配置问题。如果您有一个只“偶尔”使用的bean,并且该bean配置错误,那么您的应用程序在使用该bean并抛出错误之前可能会在生产环境中停止几天。在启动时了解这个问题要好得多。另外,通常更期望支付初始化成本(即,性能、时间延迟等)。例如,在Web应用程序中,您需要在启动时初始化bean的成本,而不是客户第一次使用您的购物车(等待购物车bean进行第一次初始化),然后在她结账时再次使用,然后在处理付款时再次使用,等等。这是一些原因。[编辑]p.s.来自Spring参考指南第6.4.4节Lazy-initialized beans默认情况下,ApplicationContext实现会在初始化过程中急切地创建和配置所有单例bean。通常,这种预示例化是期望的,因为配置或周围环境中的错误被立即发现,而不是几小时或甚至几天之后。如果不需要这种行为,可以通过将bean定义标记为lazy-initialized来防止单例bean的预示例化。延迟初始化的bean告诉IoC容器在第一次请求时创建bean示例,而不是在启动时。
ou6hu8tu2#
这是我们今天才发现的,如果你的bean方法之一有@KafkaListener注解(在其他框架中可能存在这个问题的变体),并且您使bean @Lazy以避免与此bean关联的另一个bean的循环引用,并且没有其他对这些bean的引用,那么bean将永远不会被示例化,并且Kafka侦听器方法将永远不会激活,而不对可用消息进行触发。
2条答案
按热度按时间zzlelutf1#
主要的“缺点”是不能立即捕获配置问题。如果您有一个只“偶尔”使用的bean,并且该bean配置错误,那么您的应用程序在使用该bean并抛出错误之前可能会在生产环境中停止几天。在启动时了解这个问题要好得多。
另外,通常更期望支付初始化成本(即,性能、时间延迟等)。例如,在Web应用程序中,您需要在启动时初始化bean的成本,而不是客户第一次使用您的购物车(等待购物车bean进行第一次初始化),然后在她结账时再次使用,然后在处理付款时再次使用,等等。
这是一些原因。
[编辑]
p.s.来自Spring参考指南第6.4.4节Lazy-initialized beans
默认情况下,ApplicationContext实现会在初始化过程中急切地创建和配置所有单例bean。通常,这种预示例化是期望的,因为配置或周围环境中的错误被立即发现,而不是几小时或甚至几天之后。如果不需要这种行为,可以通过将bean定义标记为lazy-initialized来防止单例bean的预示例化。延迟初始化的bean告诉IoC容器在第一次请求时创建bean示例,而不是在启动时。
ou6hu8tu2#
这是我们今天才发现的,如果你的bean方法之一有@KafkaListener注解(在其他框架中可能存在这个问题的变体),并且您使bean @Lazy以避免与此bean关联的另一个bean的循环引用,并且没有其他对这些bean的引用,那么bean将永远不会被示例化,并且Kafka侦听器方法将永远不会激活,而不对可用消息进行触发。