Vorwort
Heutzutage können fast die meisten Java -Anwendungen wie Tomcat, Struts2, Netty usw., mit denen wir vertraut sind, sie nicht zählen.
Um die Universalität zu erfüllen, werden Konfigurationsdateien für Benutzer bereitgestellt, um Funktionen anzupassen.
Es gibt sogar einige Netzwerk-Frameworks wie Netty, die fast vollständig konfiguriert sind, und wir nennen diese Software in der Regel "Microker-Architektur".
Was auch immer Sie es konfigurieren, es ist das, was es ist.
Es ist das, was Sie es konfigurieren.
Die häufigsten Konfigurationsdateiformate sind XML, Eigenschaften und andere Dateien.
In diesem Artikel wird das häufigste und häufigste Szenario beim Laden von Konfigurationen erläutert, weshalb eine Konfigurationsdatei in ein Pojo -Objekt in Java zugeordnet ist.
Und diskutieren Sie, wie Sie verschiedene Arten des Ladens implementieren. Beispielsweise werden einige Konfigurationen aus lokalen XML -Dateien geladen, während einige Konfigurationen aus lokalen Eigenschaftendateien geladen werden müssen. Darüber hinaus müssen einige Konfigurationen über das Netzwerk geladen werden.
So implementieren Sie einen solchen Konfigurationslastmechanismus, damit nach diesem Mechanismus die Code -Ladekonfiguration nicht überall verbreitet wird und skalierbar und überschaubar ist.
Konfigurieren Sie den Loader
Zunächst benötigen wir einen Konfigurationsloader, und dieser Konfigurationsloader kann viele verschiedene Lademethoden haben. Daher verwenden wir eine Schnittstelle, um sie wie folgt zu beschreiben:
/** * * * @Author bean * @date 21. Januar 2016 um 11:47:12 Uhr * @Version 1.0 * */public interface iconFigloader <t> {/** * laden Sie die von T * * @return * @throws configexception */public t tippte configeced (). Aber warum müssen wir Generics <T> auf dieser Schnittstelle deklarieren?
Wenn wir einen Konfigurationsloader verwenden möchten, müssen Sie diesen Konfigurationsloader natürlich mitteilen, welche Ergebnisse Sie nach dem Laden erhalten müssen.
Wenn Sie beispielsweise die Konfiguration laden und ein AppleConfig -Objekt abrufen möchten, können Sie die oben definierte Schnittstelle verwenden:
IConFigLoader <Pepeconfig> lader = new ApplEconFigloader <Pepeconfig> (); ApplEconfig config = loader.load ();
So konvertieren Sie die Informationen in der Konfigurationsdatei in ein AppleConfig -Objekt und können diese AppleConfig -Objektinstanz abrufen.
Bisher können wir so lange, wie unser AppleConFigloader die spezifische Arbeit beim Laden von Konfigurationsdateien implementiert, die Konfigurationen problemlos laden.
Es kann gesagt werden, dass die Konfiguration jedoch nicht auf unterschiedliche Weise geladen werden kann, z. B. das Laden durch Eigenschaften, DOM, SAX oder Laden durch einige Open-Source-Bibliotheken von Drittanbietern.
Zusätzlich zur Konfiguration des Loaders benötigen wir auch eine andere Rolle, den Anbieter für die Konfiguration der Lademethode. Nennen wir es iconfigProvider.
Konfigurieren Sie den Anbieter von Lademethoden
Der Anbieter von Konfigurationslademethoden kann dem Konfigurationsloader eine Lademethode bereitstellen, mit anderen Worten, ein Objekt für den Konfigurationsloader bereitzustellen.
Wenn der Anbieter über DOM geladen wird, stellt er dem Loader ein Dokumentobjekt bereit.
Wenn der Anbieter durch Eigenschaften geladen wird, liefert er dem Lader ein Eigenschaftenobjekt. Wenn der Anbieter durch die Methode, die von einer Klassenbibliothek von Drittanbietern wie Apache-Commons-Digester3 (Tomcat-Konfigurationsbelastung) bereitgestellt wird, liefert der Anbieter dem Loader-Anbieter ein Fermenterobjekt, das die Bereitstellung der Anbieter nur für die Konfiguration des Laders selbst zur Konfiguration der Ladung beteiligt.
Wir verwenden einen Schnittstellen -IconFigProvider, um diesen Anbieter zu definieren
/** * * * @Author bean * @date 21. Januar 2016 um 11:54:28 Uhr * @Version 1.0 * */public interface iconFigProvider <t> {/** * bietet eine Konfigurationsquelle, die zum Laden von Konfigurationen verwendet wird. Warum gibt es hier <T>, um Generika zu deklarieren?
Wenn Sie einen Anbieter benötigen, müssen Sie dem Anbieter zumindest mitteilen, was er bereitstellen sollte.
Daher wird dies dadurch bestimmt, was ein Anbieter bereitstellen wird.
Gleichzeitig können wir zuerst eine Fabrik bauen und bestimmte Anbieter erzeugen lassen:
/** * * * @Author bean * @date 21. Januar 2016 um 11:56:28 Uhr * @Version 1.0 * */public class configProviderfactory {private configProviderfactory () {werfen Neue nicht unterstützte OperationSexception ("Eine Faktorklasse nicht initialisieren:" + getClass (). } public static iconFigProvider <Document> erstellteOcumentProvider (String filepath) {neuer documentProvider (filepath) zurückgeben; } public static iconFigProvider <Porpies> createPropertieSprovider (String filepath) {Neue PropertieProvider (Filepath) zurückgeben; } public static iconFigProvider <Gerester> erstelltigesterProvider (String filepath) {return New DigesterProvider (Filepath); }}Können Sie mit der Implementierung des spezifischen Konfigurationsladers beginnen?
Noch nicht in Ordnung!
Angenommen, wir haben eine Konfigurationsdatei namens Apple.xml. Und wir müssen diesen Apple.xml in ein AppleConfig -Objekt über DOM laden.
Zunächst möchte ich einen Anbieter erstellen, der über die Anbieterfabrik ein Dokument bereitstellen kann. Dann bekomme ich diesen Anbieter und kann seine Methode zur Verfügung stellen, um das Dokumentobjekt zu erhalten.
Mit dem Dokumentobjekt kann ich mit dem Laden der Konfiguration beginnen.
Wenn Sie jedoch Bananaconfig laden möchten, PearConfig ...... sind die Schritte gleich. Daher benötigen wir auch eine abstrakte Klasse, um einige Standardverhaltensweisen zu implementieren.
/** * * * @Author bean * @date 21. Januar 2016 um 11:59:19 Uhr * @Version 1.0 * */public Abstract Class AbstractConfigloader <T, u> implementiert den IconFigloader <T> {Protected IconFigProvider <u> Provider; Protected AbstractConfigloader (iConFigProvider <u> Provider) {this.Provider = Provider; } / * * @see iconFigloader#load () * / @Override public t load () löscht ConfigException {return load (getProvider (). bereit ()); } public abstract t last (u laderSource) löst die Konfiguration aus; Protected IconFigProvider <U> getProvider () {return this.Provider; }}Jeder Konfigurationsloader verfügt über einen Parameterkonstruktor, der einen Anbieter empfängt.
Der Generikum gibt an, ob ich ApplEconfig oder Bananconfig laden möchte. Das generische <u> gibt an, welche Lastmethode zu laden ist, ist ein Dokument, Eigenschaften oder etwas anderes.
Praktische Anwendungsbeispiele
Es gibt einen Gemüsemarktkonfigurationsdateimarkt.xml, der die Produkte des Gemüsemarktes konfiguriert, einschließlich zwei Produkte, nämlich Äpfel und Eier.
<Markt> <Apple> <farben> Rot </color> <price> 100 </price> </Apple> <geise> <gewicht> 200 </Gewicht> </egg> </markt>
Es gibt auch eine Konfigurationsdatei für die Namen von Chefs in jedem Stand, Eigentümer. Properties
Port1 = Steve Jobsport2 = Bill GateSport3 = Kobe Bryant
Definieren wir zuerst die folgenden Klassen:
Marktconfig.java
/** * * * @Author bean * @date 21. Januar 2016 um 11:03:37 Uhr * @Version 1.0 * */public class MarketConfig {private appeconfig ApplEconfig; Privat Eggconfig Eggconfig; Private OwnerConfig OwnerConfig; public AppleConfig getAppleConfig () {return AppleConfig; } public void setAPleConfig (ApplEconfig ApplEconfig) {this.apleConfig = apleConfig; } public Eggconfig Geteggconfig () {return Eggconfig; } public void setegeggconfig (Eggconfig Eggconfig) {this.eggconfig = Eggconfig; } public OwnerConfig getownerconfig () {return ownerConfig; } public void setownerconfig (OwnerConfig OwnerConfig) {this.ownerconfig = OwnerConfig; }}Apleconfig.java
/** * * * @Author bean * @date 21. Januar 2016 um 11:03:45 Uhr * @Version 1.0 * */public class appeconfig {privat int price; private Saitenfarbe; public void setprice (int preis) {this.price = price; } public int getPrice () {return this.price; } public void setColor (String Farbe) {this.color = color; } public String getColor () {return this.color; }}Eggconfig.java
/** * * * @author bean * @date 21. Januar 2016 um 11:03:58 Uhr * @Version 1.0 * */public class Eggconfig {privat int Gewicht; public void set weight (int Gewicht) {this.gewicht = Gewicht; } public int getWeight () {return this.weight; }} OwnerConfig.java
/** * * * @Author bean * @date 21. Januar 2016 um 11:04:06 Uhr * @Version 1.0 * */public class OwnerConfig {private map <String, String> Eigentümer = new HashMap <String, String> (); public void Addowner (String Portname, String -Eigentümer) {this.unner.put (portname, Eigentümer); } public String getownerByportname (String portname) {return this.unner.get (portname); } public map <String, String> Getowners () {return collectionss.unmodifiablemap (this.unterner); }} Für dieses Beispiel gibt es zwei Konfigurationslastmethoden, nämlich DOM- und Eigenschaften -Lademethoden.
Unsere Anbieter müssen also Fabriken mit zwei Anbietern bauen.
Und zwei Konfigurationslader müssen definiert werden, nämlich:
OwnerConfigloader
/** * * * @author bean * @date 21. Januar 2016 um 23:24:50 Uhr * @Version 1.0 * */public class OwnerConFigloader erweitert den AbstractConFigoader <OwnerConfig, Eigenschaften> {/** * @param Provider */Protected OwnerconFig (iconfig); } / * * @see AbstractConfigloader#load (java.lang.Object) * / @Override public OwnerConFig Load (Properties Props) löscht ConfigException {OwnerConfig OwnerConfig = New OwnerConfig (); / ** * Verwenden Sie Requisiten, um den Eigenschaftswert von OwnerConfig * * zu setzen. Der Code wird hier weggelassen */ return OwnerConfig; }}Dann gibt es MarketConfigloader
import org.w3c.dom.document;/** * * @Author bean * @date 21. Januar 2016 um 11:18:56 PM * @VERSION 1.0 * */public class marktconFigloader erweitert AbstractConFigloader <MarketConfig, Dokument> {/** * @param Provider */Protected MarketConfig. Super (Anbieter); } / * * AbstractConfigloader#load (java.lang.Object) * / @Override public MarketConfig Load (Dokumentdokument) löst ConfigException {MarketConfig MarketConfig = new MarketConfig () aus; ApplEconfig ApplEconfig = new ApplEconfig (); Eggconfig Eggconfig = neuer Eggconfig (); / ** * Verarbeiten Sie das Dokument hier, und dann können Sie * apleconfig und Eggconfg * * * Der Code hier wird */ marktconfig.setAPlpleconfig (ApplEconfig) weggelassen; MarketConfig.Seteggconfig (Eggconfig); / ** * Da OwnerConfig Eigenschaften laden muss, ist es nicht XML *, also müssen wir hier einen New OwnerConFigloader erstellen und ihn delegieren, um OwnerConfig */ OwnerConfigloader OwnerConFigloader = New OwnerConFigloader (configProviderfactory.CreatRepertiesProvider (your_file_path)) zu laden. OwnerConfig OwnerConfig = OwnerConFigloader.load (); MarketConfig.Setownerconfig (OwnerConfig); Return MarketConfig; }}Wie bekommen wir dann MarketConfig auf Anwendungsebene?
MarketConFigloader MarketConfigloader = New MarketConFigloader (configProviderFactory.CreatedocumentProvider (your_file_path));
MarketConfig MarketConfig = MarketConfigloader.load ();
Vielleicht gibt es einen Ort, an dem Menschen überrascht sein können. Es gibt offensichtlich vier Konfigurationsklassen. Warum gibt es also nur zwei Konfigurationslader?
Da MarketConfig, Eggconfig und AppleConfig alle aus derselben XML -Konfigurationsdatei geladen sind, kann es über den MarketConfigloader geladen werden, solange ein Dokumentobjekt verwendet wird.
OwnerConfig ist eine andere Lademethode, daher wird ein weiterer Lader benötigt.
Ende
Der in diesem Artikel vorgeschlagene Konfigurationsbelastungsmechanismus kann nicht dazu beitragen, die Konfiguration zu laden. Dies sollte DOM, SAX und einigen anderen Open -Source -Bibliotheken wie DOM4J und Fermenter überlassen werden.
Der in diesem Artikel vorgeschlagene Konfigurationsbelastungsmechanismus kann jedoch den Konfigurationsbelastungsmechanismus flexibler und einfacher machen und mehrere Konfigurationslastmethoden integrieren, sie in einen Mechanismus integrieren und ihre eigenen Punkte spielen.
In der Tat muss einige Software häufig Konfigurationen aus Konfigurationsdateien in mehreren verschiedenen Formaten laden, wie z. B. Strus2, und eine inländische Open -Source -Datenbank Middleware -Software, die ich in letzter Zeit erforscht und Blut erbricht.
Wenn es keinen vollständigen Konfigurationslastmechanismus gibt, ist der Code mehr verstreut und weniger aufrechterhalten. Es kann leicht dazu führen, dass Menschen Blut erbrechen.