这是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,它将是一个单例实例。
答案 0 :(得分:0)
这是否意味着如果我引用一个bean,它将是一个单例实例。
不,但是在实例化引用bean时将实例化所引用的bean。如果Bean A(单例范围)与Bean B(原型范围)具有ref
,则将创建Bean B并将其注入到Bean A中一次。就Bean A而言,Bean B 是单身。
ProxyFactoryBean
必须包含bean名称列表,以便在创建ProxyFactoryBean
时自动强制取消引用拦截器。通过保存名称列表,它可以将拦截器的查找推迟到最后一分钟,从而允许拦截器成为原型范围的bean。
这有帮助吗?