内部bean接收ApplicationEvents?

时间:2013-10-02 10:04:23

标签: spring

我有这样的配置

<bean id="outer" class="someclass" scope="singleton">
     <property name="p">
         <bean class="otherclass"/>
     </property>
</bean>

otherclass实现了ApplicationListener接口。但这给了我以下错误:

  

内部bean'名称'实现ApplicationListener接口但由于其包含ApplicationContext而无法通过事件多播进行访问,因为它没有单例范围。只允许顶级侦听器bean为非单例范围。

据我在Spring文档的其他地方可以找到,当外部bean是单例时,内部bean被认为是单例。

我以前有过工作,但我不确定是什么改变了。我也尝试在内部bean上指定scope =“singleton”和id,但它没有改变任何东西。

为什么我的内豆不能接收ApplicationEvents

2 个答案:

答案 0 :(得分:1)

  

据我在Spring文档的其他地方可以找到,当外部bean是单例时,内部bean被认为是单例。

内部bean总是 prototype 作用域(ref),但它们只在单例bean中使用时才被实例化,因为没有办法从更多内容中引用它们比配置中的一个地方。

如果您希望您的otherclass bean接收事件,您必须将其自身设为顶级单例bean

<bean id="otherclass-bean" class="otherclass" scope="singleton"/>

<bean id="outer" class="someclass" scope="singleton">
     <property name="p">
         <ref local="otherclass-bean"/>
     </property>
</bean>

答案 1 :(得分:0)

答案实际上是由一些不相关的代码引起的,这些代码覆盖了bean的名称。所以我的orignal场景应该独立运作。