代码之家  ›  专栏  ›  技术社区  ›  Brandon Yarbrough

SpringXML内部bean问题

  •  5
  • Brandon Yarbrough  · 技术社区  · 16 年前

    我已经创建了一个包含其他bean列表的SpringBean,比如:

    <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”不是 @自动售货机 名单。但是,给出所有这些槽bean的名称,然后从XML引用它们似乎是不必要和丑陋的。

    有没有一种方法可以定义另一个be an中的be an,而不是“内部”be an?还是有更好的方法来处理这种设计?

    2 回复  |  直到 9 年前
        1
  •  5
  •   skaffman    16 年前

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

    内部bean总是匿名的 它们的作用域始终是原型。 请注意,它不是 可以将内部豆子注入 合作的豆子 围豆。

    编辑以删除那些没有经过深思熟虑、不相关或完全错误的内容

    我建议不要自动连接 InvSlot 豆子,你用 InvManager 而不是豆类。然后你可以问 入侵管理器 对于名单 入槽 bean,同时将内部bean定义列表保存在 入侵管理器 定义。

        2
  •  0
  •   Paul McKenzie    16 年前

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