Spring中@lazy和@Scope("prototype")有什么区别

use*_*453 1 java spring

根据我在网上阅读的资源,@lazy 和范围原型都按需创建 bean,这与默认范围(单例)不同。那么什么时候适合使用@lazy而不是prototype,反之亦然,或者在定义类时一起使用它们呢?

提前致谢。

Tyl*_*ppe 6

@Lazy 不是一个范围。要回答您的问题,您首先需要了解范围和实例化之间的关系。

每个容器创建一次单例(默认范围)(例如,在 Web 应用程序启动时)。每次注入都会创建一次原型(每次类获取 bean 时)。

@Lazy 告诉 Spring 不要急于创建 bean。对于单例来说,这意味着它不会在启动时创建,而是在第一次注入时构建。它对原型没有影响,因为它们在注入之前不会被创建。

综上所述,@Lazy 只适用于单例。如果所述惰性单例是由非惰性单例(在启动时创建)注入的,则 @Lazy 不会有效执行任何操作。

注意:@Lazy 还可以影响其他范围,例如请求、会话等。您可能正在使用这些代理,这将在技术上控制实际范围/惰性。

有关范围的更多信息,请参阅 Spring 的文档:

http://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch04s04.html