2009-08-12 16 views
5

ho creato un fagiolo molla che contiene un elenco di altri fagioli, in questo modo:Primavera XML fagioli interna domanda

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

Il problema, però, è che altrove ho usato un @Autowired un'annotazione in un'altra classe di afferrare un elenco di tutti i fagioli di attuazione di una certa interfaccia che alcuni di questi fagioli interiori implementare, in questo modo:

@Autowired 
public void registerInventoryHandlers(List<InvSlot> slots) { 
    //... do some setup stuff with beans that implement the InvSlot interface. 
} 

il problema qui è che a quanto pare i "fagioli interiori" definiti in XML non fanno parte della lista @Autowired. Tuttavia, dare tutti questi nomi di slot e quindi farvi riferimento dall'XML sembra non necessario e brutto.

C'è un modo per definire un bean all'interno di un altro bean, ma non essere un bean "interno"? O c'è un modo migliore per gestire questo progetto?

risposta

5

Fagioli definite all'interno di altri fagioli sono, per definizione, i fagioli "interni". I documenti dicono:

I bean interni sono sempre anonimi e sono sempre definiti come prototipi. Si noti inoltre che non è possibile immettere bean interni nei bean di collaborazione diversi dal bean che contiene .

modificato per rimuovere roba che è stato mal pensata, irrelevent o semplicemente sbagliato

suggerisco invece di autowiring l'elenco dei InvSlot fagioli, si autowire te stesso con il fagiolo InvManager invece. È quindi possibile chiedere allo InvManager l'elenco di bean InvSlot, mantenendo l'elenco delle definizioni di bean interno all'interno della definizione InvManager.

+0

Ah, al contrario! @Autowired ha alcuni usi sorprendenti e meno conosciuti. Per citare la documentazione di Spring: "È anche possibile fornire tutti i bean di un particolare tipo da ApplicationContext aggiungendo l'annotazione a un campo o un metodo che si aspetta un array di quel tipo" –

+0

Inferno insanguinato, così fa. Ti ringrazio, mi hai insegnato una cosa nuova :) – skaffman

+0

Ho provato ad usarlo per alimentare una sorta di coda "non c'è bisogno di registrarti" e mi sono creduto maledettamente intelligente. Ma poi mi sono imbattuto in questa particolare lattina di vermi. –

0

Ho trovato che l'utilizzo di @Component funziona molto bene.

@Component class InvManager { 
    ... 
    @Autowired 
    public void registerInventoryHandlers(List<InvSlot> slots) { ... } 
} 

e

@Component class HeadSlot implements InvSlot { ... } 

e

@Component class ShoulderSlot implements InvSlot { ... } 

La configurazione diventa

<context:component-scan base-package="com.foo.bar"/> 
Problemi correlati