为什么我们需要@ Lookup,scope = prototype怎么了?

时间:2019-04-04 20:04:02

标签: java spring

我正在研究四季豆,遇到了@Lookup,它说:

  

如果我们碰巧决定拥有原型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)案例的情况,并请说明不同之处 谢谢你

1 个答案:

答案 0 :(得分:2)

Spring中的隐式Bean范围是 Singleton
这意味着对于JVM实例,从理论上讲,内存中仅存在一个Bean实例。

当您在{em> Singleton 范围内的Bean中@Autowire {em>原型范围的Bean时,该 Prototype 成为一种排序-的单身。考虑一下;创建了 Singleton ,其可注入字段获得了 Autowired ,就是这样,该实例及其所有字段都永远存在(请记住那些 Prototype 范围的字段是“纯”实例,没有被代理)。


@Lookup

代理驱动的注释。这意味着Spring将使用JDK代理或CGLIB代理扩展您的class,并且它将覆盖/实现带有@Lookup注释的方法,并提供其自己的版本,该版本每次使用BeanFactory#getBean它被调用。
此时文档很清晰

  

一个注释,指示“查找”方法,该注释将被   容器将其重定向回BeanFactory进行getBean调用。

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


据您所知,在
“ other”范围内的Bean中使用 Prototype 范围内的Bean的另一种方法是使用ProxyFactoryBean。唯一的区别是,代理是在配置时创建的,然后可用于直接@Autowire定位,因此不需要定义@Lookup方法,有时不需要(通常是人们所不希望的)像我一样迷恋干净代码的人。

相关问题