2009-08-12 48 views
5

我已經創建了一個Spring bean含有其他bean的列表,像這樣內部bean:春XML問題

<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定義不是@Autowired列表的一部分。但是,給所有這些slot bean名稱,然後從XML中引用它們看起來沒有必要和難看。

有沒有一種方法來定義另一個bean裏面一個bean,但不會是一個「內部」豆?還是有更好的方法來處理這種設計?

回答

5

豆類, 「內」 豆。該文件說:

內部bean總是匿名的, 它們總是prototype模式。 另外請注意,這不是 可能內部bean注入到比 封閉豆等 合作豆。

編輯刪除的東西,是未經深思熟慮,無關緊要,或者只是簡單的錯誤

我建議,而不是自動裝配的InvSlot豆列表,你自己的自動裝配與InvManager豆代替。然後,您可以要求InvManagerInvSlot豆名單,同時保持InvManager定義中您的內部bean定義列表。

+0

啊,相反! @Autowired有一些令人驚訝的,鮮爲人知的用途。引用Spring的文檔:「也可以通過添加註釋到期望類型的數組字段或方法來提供從ApplicationContext的一個特定類型的所有豆」 – 2009-08-12 16:28:57

+0

該死的,它確實是這樣。我謝謝你,先生,你已經給了我一個新的東西:) – skaffman 2009-08-12 16:54:05

+0

我試圖用它來驅動一種「並不需要註冊自己」事件隊列,並認爲自己聰明的血腥。但後來我遇到了這種特殊的蠕蟲病毒。 – 2009-08-12 19:54:27

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