2016-08-12 78 views
0

考虑当prototype作用域的bean被注入到一个单范围的bean的情况下,如何范围代理内部工作在春季

,当我们试图使用Singleton作用域的bean来访问原型作用域的bean,我们每次都返回相同的bean,即在singleton初始化时注入的bean。

如果我们想在每次使用作用域代理时获得不同的实例。

我没有得到这个范围代理如何在舞台后工作的概念,以及它如何神奇地给我们一个新的实例,即使这个bean存在于一个单例中。

回答

0

来自:http://docs.spring.io/spring/docs/2.5.x/reference/beans.html#beans-factory-scopes-other-injection

能够定义一个bean作用域为HTTP请求或Session(甚至你自己设计的自定义范围)都非常好,但对主要的一个值,加上Spring IoC容器不仅可以管理对象(bean)的实例化,还可以管理协作者(或依赖项)的连接。如果您想要将(例如)HTTP请求范围的bean注入另一个bean,则需要注入一个AOP代理来代替范围的bean。也就是说,您需要注入一个代理对象,该对象公开与作用域对象相同的公共接口,但它足够聪明,能够从相关作用域(例如HTTP请求)和委托方法中检索真实的目标对象调用真正的对象。要创建这样的代理,只需要将一个子元素插入到一个有作用域的bean定义中(您可能还需要在您的类路径上使用CGLIB库,以便容器可以实现基于类的代理;您还需要使用附录A,基于XML模式的配置)。那么,为什么你需要这个元素来定义bean的请求范围,session,globalSession和'在这里插入你的自定义范围'级别?究其原因,最好通过挑选除了下面bean定义解释(请注意,因为它代表了下面一个userPreferences bean定义是不完整):

<bean id="userManager" class="com.foo.UserManager"> 
     <property name="userPreferences" ref="userPreferences"/> 
    </bean> 
    <bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/> 

    <bean id="userManager" class="com.foo.UserManager"> 
     <property name="userPreferences" ref="userPreferences"/> 
    </bean> 
+0

是不是清楚了吗? – pacman