Spring在ProxyFactoryBean中使用ref引用protoyype bean

时间:2011-11-03 08:18:31

标签: java spring

这是Spring documentation,第9.5.4节

                      

<bean id="myAdvisor" class="com.mycompany.MyAdvisor">
    <property name="someProperty" value="Custom string property value"/>
</bean>

<bean id="debugInterceptor"class="org.springframework.aop.interceptor.DebugInterceptor">
</bean>

<bean id="person" 
    class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="proxyInterfaces" value="com.mycompany.Person"/>

    <property name="target" ref="personTarget"/>
    <property name="interceptorNames">
        <list>
            <value>myAdvisor</value>
            <value>debugInterceptor</value>
        </list>
    </property>
</bean>

现在,代码下面的注释说明:

  

您可能想知道列表的原因   不包含bean引用。这样做的原因是,如果   ProxyFactoryBean的singleton属性设置为false,它必须能够   返回独立的代理实例。如果有任何顾问   本身就是一个原型,需要返回一个独立的实例,   因此有必要获得原型的实例   来自工厂;持有参考资料是不够的。

有人可以解释一下这是如何运作的。我知道各种范围。所以我知道如果顾问是原型,则需要返回一个新实例。但我没有得到最后的陈述(以粗体突出显示)。如果我指定ref="debugInterceptor",bean创建机制会改变吗?这是否意味着如果我ref一个bean,它将是一个单例实例。

1 个答案:

答案 0 :(得分:0)

  

这是否意味着如果我引用一个bean,它将是一个单例实例。

不,但是在实例化引用bean时将实例化所引用的bean。如果Bean A(单例范围)与Bean B(原型范围)具有ref,则将创建Bean B并将其注入到Bean A中一次。就Bean A而言,Bean B 单身。

ProxyFactoryBean必须包含bean名称列表,以便在创建ProxyFactoryBean时自动强制取消引用拦截器。通过保存名称列表,它可以将拦截器的查找推迟到最后一分钟,从而允许拦截器成为原型范围的bean。

这有帮助吗?