Die Konfigurationsabdeckung ist besser als das Profil
In der Produktionspraxis ist die Konfigurationsabdeckung eine gemeinsame Methode, um verschiedene Konfigurationen in verschiedenen Umgebungen zu lösen. Verwenden Sie beispielsweise Konfigurationsdateien auf dem Produktionsserver, um die Dateien im Paket zu überschreiben, oder verwenden Sie einen zentralisierten Konfigurationsdienst, um die Standard -Geschäftskonfiguration zu überschreiben.
Im Vergleich zum Profilmechanismus (z. B. das Profil von Maven und die profilspezifischen Eigenschaften von Spring Boot) verwenden verschiedene Umgebungen unterschiedliche Konfigurationsdateien und die Overlay-Methode ist vorteilhafter. Programmierer müssen sich während der Entwicklung nicht um die Adresse, das Konto und andere Informationen der Produktionsumgebungsdatenbank kümmern. Sie können in verschiedenen Umgebungen laufen, indem sie gleichzeitig bauen. Der Profilmechanismus muss die Konfiguration der Produktionsumgebung in die Projektressourcendatei schreiben, und für verschiedene Umgebungen müssen verschiedene Konstruktionsparameter oder Betriebsparameter verwendet werden.
Spring bietet flexible Konfigurationserweiterungsfunktionen mit mehreren Möglichkeiten, um benutzerdefinierte Attributquellen in sie zu integrieren und eine einfache Konfigurationsabdeckung zu ermöglichen.
Dieser Artikel wird basierend auf Spring Boot 1.4.8/Spring 4.3.12 geschrieben
Verwenden Sie @PropertySource Annotation, um benutzerdefinierte Konfigurationsdateien und Konfigurationsüberschriften zu implementieren
@ConfigurationProperties@configurationPublic -Klasse Demoproperties {// Eigenschaften mit Getter/Setzer} @PropertySource (value = {"test.properties", "file: /etc/test.properties",}, ignoreresourcenotfound = true) @ConfigurationPublic Class DemoautoConfiguration {@autowired private Demoproperties Demoproperties; @Postconstruct public void init () {System.out.println (Demoproperties); }}Spring unterstützt die Einführung benutzerdefinierter Konfigurationsdateien mithilfe von PropertySource -Annotationen, wobei "test.properties" die Datei von ClassPath, Datei: /etc/test.Properties "lädt, dazu führt, dass Spring die /etc/test.Properties -Datei aus dem Dateisystem lastet, das die Dateilast des Datei -Lastversagens ignorieren.
Gleichzeitig ermöglicht die Konfigurationsdatei "test.Properties", da sich "Datei: /etc/test.properties" nach "test.properties" befindet.
Benutzerdefinierte Eigenschaftsquellenfabrik
Wenn Sie die Eigenschaftsquelle flexibler anpassen möchten, z. B. das Laden von Konfigurationen aus einem zentralisierten Konfigurationsdienst, können Sie die PropertySourCefactory -Schnittstelle implementieren und die Fabrikparameter der PropertySource -Annotation konfigurieren.
@Configuration@PropertySource (value = "/*Platzhalter*/, factory = compositepropertySourceFactory.class) öffentliche Klasse CompositeConfigautoConfiguration {}Das Wertwertfeld wird verwendet, um die Ressourcendatei anzugeben, die der Konfigurationsquelle entspricht. Wenn die Ressourcendatei nicht erforderlich ist, kann sie als Wert konfiguriert werden. Der Parameterwert wird an die CreatePropertySource -Methode des Fabrikparameters übergeben.
Wenn das Feld ignoreresourcenotfound als wahr angegeben ist, wird die von der Fabrik ausgelöste Ausnahme ignoriert, andernfalls wird das Start -up fehlschlagen. Manchmal ist es eine gute Praxis, den Startversagen direkt aufzudecken.
Die Definition der EigenschaftsOurcefactory -Schnittstelle lautet wie folgt:
/*** Strategieschnittstelle zum Erstellen von ressourcenbasierten {@link PropertySource} Wrappern. * * @Author Juergen Hoeller * @Since 4.3 * @see defaultPropertySourceFactory * /public interface PropertySourCefactory { /** * Erstellen Sie eine {@link PropertySource}, die die angegebene Ressource einhüllt. * @param name the name of the property source * @param resource the resource (potentially encoded) to wrap * @return the new {@link PropertySource} (never {@code null}) * @throws IOException if resource resolution failed */ PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException;}Es ist zu beachten, dass die Ladezeit von PropertySourcefactory früher als die von Frühlingsbohnenbehältern liegt, sodass die Implementierung nicht vom IOC des Frühlings abhängen kann.
PropertySourCefactory erfordert, dass die Implementierungsklasse PropertySource zurücksend macht. PropertySource ist die Kernschnittstelle der Feder -Eigenschaft (oder Konfiguration) und verfügt über viele Implementierungen, wie z. B.:
Die tatsächlichen Implementierungsklassen sind diesen weit unterlegen. Für bestimmte Zwecke können Sie Spring -Dokumentation oder Quellcode lesen.
MappropertySource und CompositepropertySource werden üblicherweise bei der Anpassung von Eigenschaftenquellen verwendet.
MAPPROPERTYSOURCE kann verwendet werden, um die von ihnen geladenen Eigenschaftsdaten zu wickeln, und siehe seine Konstruktionsmethode.
public mappropertySource (String -Name, Karte <String, Objekt> Quelle) {Super (Name, Quelle);}Letzteres kann mehrere Attributquellen laden, indem sie die Überschreibungsreihenfolge kombinieren und anpassen. Zum Beispiel:
PropertySource <?> PackageInsidePropertySource = packageInsidePropertySourciterateloader.loadPropertySource (CompositepropertySource); compositepropertySource.addPropertySource (packageInsidePropertySource); PropertySource <?> oberFilePropertySource = OUTERFILEPROPERTYSOURCEIderateloader compositepropertySource.addfirstPropertySource (oberFilePropertySource);
Die AddfirstPropertySource -Methode kann die eingehende Eigenschaft auf höchste Priorität (innerhalb dieser CompositepropertySource) festlegen, und die AddPropertySource -Methode ist das Gegenteil, und die Priorität ist danach niedriger.
Laden Sie alle Konfigurationsdateien mit demselben Namen im Abhängigkeits -JAR -Paket
Wenn Sie die Konfigurationsdatei direkt aus dem Klassenpfad laden, muss die Datei im Klassenpfad vorhanden sein. Betrachten Sie in einem Webprojekt, wenn die Datei in einem Abhängigkeits-JAR-Paket vorhanden ist, dh in Web-INF/lib/xxx.jar befindet, kann sie nicht direkt basierend auf ClassPath geladen werden. Zu diesem Zeitpunkt können Sie mit dem von Spring bereitgestellten PathMatchingResourcePuferresolver verwenden, um alle JAR -Pakete nach Ressourcennamen zu scannen, um den Zweck zu erreichen.
private list <ressource> getPackageInIsInesourcesBypattern (String Resourcename) löscht ioException {String resourcePathPattern = ressourcenPuffernresolver.classpath_ALL_URL_PREFIX + HBOOTCONFIGCONSTANTS.CONfigs + Resourcename; RessourcenpeufperResolver ressourcenePergerNresolver = neuer pathMatchingResourcePenNResolver (); return arrays.aslist (ressourcenpeufperResolver.getResources (ResourcePathPattern));} Anschließend können Sie ResourcePropertySource verwenden, um eine Immobiliensource von Ressource zu erstellen, um sie in den Frühling zu übergeben.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.