Spring XML内部bean问题

时间:2009-08-12 06:33:22

标签: spring

我创建了一个包含其他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?或者有更好的方法来处理这种设计吗?

2 个答案:

答案 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"/>