1

我有这样的配置

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

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

内部 bean ' name ' 实现了接口,但由于它没有单例范围,因此无法ApplicationListener通过其包含进行事件多播。ApplicationContext仅允许顶级侦听器 bean 具有非单例范围。

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

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

为什么我的内豆收不到ApplicationEvents

4

2 回答 2

1

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

内部 bean 始终是原型作用域(ref),但在单例 bean 中使用时它们只会被实例化一次,这仅仅是因为无法从配置中的多个位置引用它们。

如果您希望您的otherclassbean 接收事件,您必须使其本身成为顶级单例 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>
于 2013-10-02T10:18:52.677 回答
0

答案实际上是由一些不相关的代码覆盖了 bean 的名称引起的。所以我的原始场景应该可以自己运行。

于 2013-10-02T11:30:16.473 回答