我创建了一个包含其他bean列表的spring bean,如下所示:
<bean name="InventoryManager" class="InvManager">
<property name="slots">
<bean class="HeadSlot" />
<bean class="ShoulderSlot" />
<!-- ... -->
</property>
</bean>
问题是,在其他地方,我在另一个类中使用了@Autowired
注释来获取实现某些内部bean实现的某个接口的所有bean的列表,如下所示:
@Autowired
public void registerInventoryHandlers( List<InvSlot> slots ) {
//... do some setup stuff with beans that implement the InvSlot interface.
}
这里的问题是,显然XML中定义的“内部bean”不是@Autowired
列表的一部分。但是,给出所有这些插槽bean名称,然后从XML引用它们似乎是不必要和丑陋的。
有没有办法在另一个bean中定义bean,但不是一个“内部”bean?或者有更好的方法来处理这种设计吗?
答案 0 :(得分:5)
根据定义,在其他bean中定义的Bean是“内部”bean。文档说:
内部豆子总是匿名的 它们总是作为原型。 请注意,事实并非如此 可以将内豆注入 合作豆除了 封闭豆。
已修改以删除经过深思熟虑,无关紧要或仅仅是错误的内容
我建议您不要自动装配InvSlot
bean列表,而是使用InvManager
bean自动装配自己。然后,您可以向InvManager
询问InvSlot
bean的列表,同时将内部bean定义列表保留在InvManager
定义中。
答案 1 :(得分:0)
我发现使用@Component效果非常好。
@Component class InvManager {
...
@Autowired
public void registerInventoryHandlers( List<InvSlot> slots ) { ... }
}
和
@Component class HeadSlot implements InvSlot { ... }
和
@Component class ShoulderSlot implements InvSlot { ... }
您的配置变为
<context:component-scan base-package="com.foo.bar"/>