2012-06-12 11 views
11

La definizione di un bean (con lo stesso nome e classe) è valida per Spring IOC?Definizione dello stesso bean Spring con lo stesso nome

Sto avendo due file di definizione bean inclusi in web.xml. Guarda l'esempio qui sotto.

applicationContext-beans1.xml

<bean name="myWao" 
    class="com.beans.myBean">  
</bean> 

applicationContext-beans2.xml

<bean name="myWao" 
    class="com.beans.myBean">  
</bean> 

io non sto affrontando alcun problema fino ad ora. Ma questo potrebbe avere un impatto nell'ambiente reale che sarà multi-threaded e in cluster?

Nota: Entrambe le XMLs vengono caricati come io sono in grado di utilizzare gli altri bean definiti (solo una volta) in entrambe le XMLs

+0

entrambi i file xml sono veramente caricati? –

+0

Sì. Entrambi sono caricati. – hop

+0

possibile duplicato di [Spring overriding bean] (http://stackoverflow.com/questions/5849192/springs-overriding-bean) –

risposta

27

E 'valida, ma vi accorgerete che un fagiolo viene sovrascritto dal altro. Verrà visualizzato nei registri come

Overriding bean definition for... 

Questo comportamento consente di ignorare le definizioni di bean fornite in precedenza. Influisce sull'assemblaggio statico della tua app e non riguarda il threading/clustering come suggerito nella tua domanda.

Si noti che il DefaultListableBeanFactory consente di configurare questo comportamento tramite setAllowBeanDefinitionOverriding()

+0

setAllowBeanDefinitionOverriding() deve essere eseguito in anticipo. Se si crea il contesto del bean in modo programmatico, assicurarsi di utilizzare un costruttore con un parametro di aggiornamento impostato su false e quindi il caricamento del trigger "manuale". Questo funzionerà anche quando i fagioli primaverili sono distribuiti su più file/contesti. In caso contrario, se si abilita la registrazione DEBUG, verranno visualizzate solo voci di registro come 'DEBUG osbfsDefaultListableBeanFactory - Sovrascrittura della definizione di bean per bean 'myBean' con una definizione equivalente: sostituzione di ... [spring/config1.xml]] con ... ; definito in ... [spring/config2.xml]] ' –

6

Questo è valido e utile soprattutto quando si tenta di modificare l'implementazione di un fagiolo di terze parti (voglio dire, dove non è consentito di cambiare la implementazione di un bean) e Dove è necessario fornire/configurare alcune proprietà extra (unione) per il bean.

L'override del bean dipende dall'ordine degli xml forniti per creare lo ApplicationContext tramite web.xml o standalone. L'ultima definizione di bean vincerà il gioco.