2012-08-06 21 views
8

Lassen Sie uns sagen, ich habe zwei Module. Einer ist Kern und ein anderer ist ein kernabhängiges Implementierungsmodul. Core ist eine JAR-Datei für diesen abhängigen Implementierungsmodulkrieg.überschreiben Bean Konfiguration im Frühjahr

Im Kern habe ich eine Bohne wie

definiert
<bean id="x" class="com.pokuri.X"> 
<property name="y" ref="y"/> 
<property name="z" ref="z"/> 
</bean> 

Und diese Klasse hat eine Methode als

public class X{ 

    public void doSomeJob(){ 
    ....... 
    } 

} 

dieses Verfahren folgt, wird von einigen Kernklassen genannt zu werden. Jetzt muss ich die Logik in der Methode doSomeJob() von X entsprechend meiner Kern-abhängigen Implementierung ändern. Also, ich erstelle eine Klasse wie diese

und definierte die Bean mit derselben ID in einem anderen Anwendungskontext XML-Datei wie folgt.

<bean id="x" class="com.pokuri.ExtX"> 
    <property name="y" ref="y"/> 
    <property name="z" ref="z"/> 
</bean> 

und wir bauen Anwendungskontext mit contextConfigLocation Kontextparameter in web.xml Wert als classpath:springfolder angeben.

Aber in der Kernlogik bekomme ich Core-Bean-Instanz nur (d. H. X Instanz) nicht ExtX. Wie können wir diese Bean-Definition überschreiben und das System mit der neuen Extend-Bean-Definition beginnen lassen?

Und ich habe gehört, dass mit der gleichen ID in verschiedenen Anwendung Kontextdateien überschreiben zuerst geladene Bean-Definition mit später geladenen Bean-Definition. Gibt es eine priority Art von Attribut in der Bean-Definition, damit ApplicationContext die höchste Priorität verwendet, die eine niedrigere Priorität hat, wenn Beans mit derselben ID gefunden wurden.

Antwort

12

Eine Möglichkeit, die Bean-Definition zu überschreiben, ist das, was Sie angegeben haben - um sie mit derselben ID mehrfach zu definieren, und die letzte Bean-Definition mit derselben ID ist diejenige, die wirksam wird. Wenn Sie also sicherstellen, dass ExtX das letzte geladen ist, sollte es einfach funktionieren, und um dies sicherzustellen, können Sie dies in Ihrer WAR-Datei tun, anstatt mit classpath:springfolder zu laden, können Sie explizit die Kernkonfiguration in Ihrem Frühling importieren config-Datei und dann überschreibt die Bohne auf diese Weise:

<import resource="core-resource.xml"/> 
<bean id="x" class="com.pokuri.ExtX"> 
    <property name="y" ref="y"/> 
    <property name="z" ref="z"/> 
</bean> 

Dadurch wird sichergestellt, dass Ihre überschriebene Bohne ist derjenige, der in Kraft tritt.

Es gibt kein Prioritäts-/Bestellfeld, das Sie hier verwenden können. Wenn Sie möchten, können Sie alle Bean-Definitionen eines Typs laden, indem Sie Map<String,X> als Parameter angeben und nach Erwartung einer Bestelleigenschaft sortieren und verwenden es ist so, aber es gibt viel mehr Arbeit.

Ein zweiter Ansatz ist hier beschrieben: Overriding the bean defined in parent context in a child context

+0

versuchen Wird Ihr Ansatz – Pokuri

+0

Natürlich funktioniert es. Aber ist es eine gute Praxis, eine Definition durch eine andere zu ersetzen? Ich denke, es ist eine Art Hack: / –

Verwandte Themen