我正在研究四季豆,遇到了@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)案例的情况,并请说明不同之处 谢谢你
答案 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
方法,有时不需要(通常是人们所不希望的)像我一样迷恋干净代码的人。