Nehmen wir an, wir haben eine Anwendung, die für einige Kunden angepasst werden kann. Die Anwendung verwendet eine Java-basierte Spring-Konfiguration (a.k.a. Java Config) für die Abhängigkeitsinjektion. Die Anwendung besteht aus Modulen und ihren Submodulen. Jedes Modul und Submodul hat seine eigene Klasse @Configuration
, die durch die Elternkonfiguration mit @Import
importiert wird. Dies erstellt die folgende Hierarchie:
Zum Beispiel sieht ModuleAConfig
folgendermaßen aus:
Nehmen wir an, dass SubModuleA1Config
die Bean someBean
vom Typ SomeBean definiert:
Jetzt möchte ich die Anwendung für Customer1 anpassen (C1) - Ich möchte C1SomeBean
(Erweiterung SomeBean
) anstelle von SomeBean
als someBean
verwenden.
Wie kann ich dies mit minimaler Vervielfältigung erreichen?
Eine meiner Ideen war die Erstellung einer alternativen Hierarchie mit C1Config
von MainConfig
, C1ModuleAConfig
von ModuleAConfig
und C1SubModuleA1Config
von SubModuleA1Config
. C1SubModuleA1Config
überschreibt someBean()
method und gibt C1SomeBean
zurück. Leider bekomme ich mit Spring 4.0.6 etwas wie:
und tatsächlich SomeBean
klasse wird aus dem Kontext zurückgegeben anstatt von C1SomeBean
. Das ist eindeutig nicht das, was ich will.
Beachten Sie, dass Sie @Import
, das Konfigurationsklassen erweitert, nicht überschreiben können.
Wenn Sie auswählen möchten, welche Importe zur Laufzeit verwendet werden sollen, können Sie stattdessen @ImportSelector
verwenden.
Allerdings sind @Configuration
-Klassen nicht mehr die im Spring (Bereich) verwalteten Fabriken. Da Sie bereits eine Factory-Methode für someBean haben, müssen Sie nicht noch weiter gehen:
Aktualisieren
Verwenden eines ImportSelectors:
%Vor% Da jeder Kunde jedoch ein separates Paket hat, sollten Sie auch @ComponentScan
verwenden. Dies wählt die vorhandene Konfigurationsklasse aus und benötigt keine zusätzliche Konfigurationseigenschaft.
Tags und Links java spring spring-java-config