【问题标题】:Spring XML inner bean questionSpring XML内部bean问题
【发布时间】:2009-08-12 06:33:21
【问题描述】:

我创建了一个包含其他 bean 列表的 spring bean,如下所示:

<bean name="InventoryManager" class="InvManager">
  <property name="slots">
    <bean class="HeadSlot" />
    <bean class="ShoulderSlot" />
    <!-- ... -->
  </property>
</bean>

不过,问题在于,在其他地方,我在另一个类中使用了 @Autowired 注释来获取所有 bean 的列表,这些 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?或者有没有更好的方法来处理这种设计?

【问题讨论】:

    标签: spring


    【解决方案1】:

    根据定义,在其他 bean 中定义的 bean 是“内部”bean。文档说:

    内部 bean 始终是匿名的,并且 它们总是被定义为原型。 另请注意,它不是 可以将内部 bean 注入 合作豆以外的 封闭bean。

    经过编辑以删除考虑不周、无关紧要或完全错误的内容

    我建议不要自动装配InvSlot bean 的列表,而是使用InvManager bean 来自动装配自己。然后,您可以向 InvManager 询问 InvSlot bean 的列表,同时将内部 bean 定义的列表保留在 InvManager 定义中。

    【讨论】:

    • 啊,恰恰相反! @Autowired 有一些令人惊讶的、鲜为人知的用途。引用 Spring 的文档:“也可以通过将注释添加到需要该类型数组的字段或方法来从 ApplicationContext 提供特定类型的所有 bean”
    • 该死的,确实如此。谢谢你,先生,你教会了我一个新东西:)
    • 我试图用它来支持一种“不需要注册自己”的事件队列,并认为自己非常聪明。但后来我遇到了这个特殊的蠕虫罐头。
    【解决方案2】:

    我发现使用@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"/>
    

    【讨论】:

      猜你喜欢
      • 2011-06-12
      • 2012-10-13
      • 1970-01-01
      • 2015-01-06
      • 1970-01-01
      • 2017-08-08
      • 2015-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多