【问题标题】:Why do we need @Lookup, whats wrong with scope=prototype?为什么我们需要@Lookup,scope=prototype 有什么问题?
【发布时间】:2019-04-04 20:04:01
【问题描述】:

我在研究春豆,偶然发现@Lookup,上面写着:

如果我们碰巧决定有一个原型 Spring bean,那么我们就是 几乎立即面临我们的单身人士将如何解决的问题 Spring bean 访问这些原型 Spring bean?

嗯,我不明白,因为当我研究 scope=prototype 时,它​​说:

4.4.2 原型范围 bean 部署的非单例原型范围导致每次创建一个新的 bean 实例 请求该特定 bean

所以我似乎误解了这些词:

对该特定 bean 发出请求

实际上在 Spring 框架中编程的每一行代码都在某个 bean 中(即@controller、@Service 等),不是吗? 而且几乎所有这些都是单例,不是吗? 因此,如果我需要原型,我只需创建 scope=prototype 并且几乎每次都将其注入另一个 bean(即@controller、@Service 等),不是吗?

所以请给出一个真实世界的场景,1)什么时候应该使用@Lookup,2)什么时候不需要 好的 1) 场景:

@Component
@Scope("prototype")
public class SchoolNotification {
    // ... prototype-scoped state
}

@Component
public class StudentServices {

    // ... member variables, etc.

    @Lookup
    public SchoolNotification getNotification() {
        return null;
    }

    // ... getters and setters
}

请给我看一下 2) 案例的场景,并解释一下区别 谢谢你

【问题讨论】:

  • 为了进一步的启迪,您可以用于进一步研究的术语是“方法注入”。在添加 @Lookup 注释之前,实际注入单例 bean 的方式涉及一些非常混乱的语法,涉及使单例类抽象。

标签: java spring


【解决方案1】:

Spring 中的隐式 Bean 作用域是 Singleton
这意味着对于 JVM 实例,只有一个 Bean 实例存在于内存中(理论上)。

当你 @Autowire 一个 Prototype-scoped Bean 在一个 Singleton-scoped Bean 中时,那个 Prototype 就变成了一种-单身人士。考虑一下;一个Singleton被创建,它的可注入字段被Autowired,就是这样,实例和它的所有字段永远存在(记住那些Prototype em> 范围的字段是“纯”实例,它们没有被代理)。


@Lookup

是一个代理驱动的注解。这意味着 Spring 将使用 JDK 代理或 CGLIB 代理扩展您的 class,并将覆盖/实现 @Lookup-annotated 方法,提供其自己的版本,每次调用时使用 BeanFactory#getBean
文档在这一点上很清楚

指示“查找”方法的注释,将被 容器将它们重定向回BeanFactory 以进行getBean 调用。

因此,这意味着每次都会返回一个新的 Bean 实例。


据您所知,使用 Prototype 范围内的 Bean
“其他”范围 Bean 的另一种方法是使用 ProxyFactoryBean。唯一的区别是代理是在配置时创建的,然后直接提供给@Autowireing,因此不需要定义@Lookup 方法,这有时是不想要的(通常是那些痴迷于干净的代码,就像我一样)。

【讨论】:

    猜你喜欢
    • 2019-06-09
    • 2011-01-09
    • 2014-06-18
    • 2017-02-26
    • 2011-04-03
    • 2017-07-27
    • 2020-09-21
    • 2020-03-09
    • 2018-12-24
    相关资源
    最近更新 更多