范围内的代理如何在Spring

时间:2016-08-12 07:03:14

标签: spring spring-mvc proxy javabeans

考虑将原型范围的bean注入到单例作用域bean中的情况

当我们尝试使用单例范围的bean访问原型范围的bean时,我们每次都返回相同的bean,即在单例初始化时注入的bean。

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

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

1 个答案:

答案 0 :(得分:0)

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

能够定义一个作用于HTTP请求或Session的bean(或者你自己设计的自定义范围)都很好,但Spring IoC容器的主要增值之一是它不管理只有对象(bean)的实例化,还有协作者(或依赖关系)的连接。如果要将(例如)HTTP请求作用域bean注入另一个bean,则需要注入AOP代理来代替作用域bean。也就是说,您需要注入一个代理对象,该对象公开与作用域对象相同的公共接口,但这足够聪明,能够从相关作用域(例如HTTP请求)和委托方法中检索真实的目标对象。调用真实物体。

要创建这样的代理,您只需要将子元素插入到作用域bean定义中(您可能还需要类路径上的CGLIB库,以便容器可以实现基于类的代理;您还需要使用附录A,基于XML Schema的配置)。那么,为什么在请求,会话,globalSession和'在此处插入自定义范围'级别的bean的定义中需要此元素?通过挑选以下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>