Sagen wir, ich habe zwei Module. Einer ist Kern und ein anderer ist ein kernabhängiges Implementierungsmodul. Core ist eine JAR-Datei für dieses abhängige Implementierungsmodul War.
Im Kern habe ich eine Bean wie
definiert %Vor%Und diese Klasse hat eine Methode wie folgt
%Vor%Diese Methode wird von einigen Kernklassen aufgerufen. 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
%Vor%und definierte die Bean mit derselben ID in einer anderen XML-Datei des Anwendungskontextes wie dieser.
%Vor% und wir erstellen den Anwendungskontext mit dem contextConfigLocation
-Kontextparameter in web.xml
, der den Wert als classpath:springfolder
angibt.
Aber in der Kernlogik bekomme ich nur Core-Bean-Instanzen (d. h. X
instance) und 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 derselben ID in verschiedenen Anwendungen Kontextdateien die zuerst geladene Bean-Definition mit später geladener Bean-Definition überschreiben. Gibt es eine priority
-Art des Attributs 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.
Eine Möglichkeit, die Bean-Definition zu überschreiben, ist das, was Sie angegeben haben - es muss mehrmals mit derselben ID definiert werden, und die letzte Bean-Definition mit der gleichen ID ist diejenige, die wirksam wird. Wenn Sie also sicherstellen, dass ExtX
der letzte geladene ist, sollte es einfach funktionieren. Um dies zu gewährleisten, können Sie dies in Ihrer WAR-Datei tun, anstatt mit classpath:springfolder
zu laden. Sie können die Core-Konfiguration explizit importieren in der Spring-Konfigurationsdatei Ihres Krieges und überschreiben Sie die Bean dann folgendermaßen:
Dadurch wird sichergestellt, dass Ihre überschriebene Bean die Wirkung hat.
Es gibt kein Prioritäts- / Auftragsfeld, 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 einer Auftragseigenschaft sortieren benutze es so, aber es gibt viel mehr Arbeit.
Ein zweiter Ansatz wird hier beschrieben: Überschreiben der im übergeordneten Kontext in einem untergeordneten Kontext definierten Bean
Tags und Links spring inversion-of-control