根据我在在线资源上阅读的内容,@lazy 和范围原型都按需创建 bean,这与默认范围是单例不同。那么什么时候适合使用@lazy 而不是prototype,反之亦然,或者在定义类的时候一起使用呢?
提前致谢。
@Lazy 不是范围。要回答您的问题,您首先需要了解范围和实例化之间的关系。
每个容器创建一次单例(默认范围)(例如,在启动 web 应用程序时)。每次注入都会创建一次原型(每次类获取 bean 时)。
@Lazy 告诉 Spring 不要急于创建 bean。对于单例,这意味着它不会在启动时创建,而是在第一次注入时构建。它对原型没有影响,因为它们在注入之前不会被创建。
总之,@Lazy 仅适用于单例。如果所说的惰性单例是由非惰性单例(在启动时创建的)注入的,那么 @Lazy 不会有效地执行任何操作。
注意:@Lazy 还可以影响其他范围,例如请求、会话等。您可能正在为这些范围使用代理,这将在技术上控制实际范围/惰性。
有关范围的更多信息,请参阅 Spring 的文档:
http://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch04s04.html
Lazy : 一个 bean 仅在被引用时才被初始化,但随后可以被重用。
原型:每次使用 bean 都会获得一个新实例。
因此 Lazy 占用的资源较少。