Préface
De nos jours, presque la plupart des applications Java, telles que Tomcat, Struts2, Netty, etc., que nous connaissons, fourniront des fichiers de configuration aux utilisateurs pour personnaliser les fonctions pour répondre à la généralité.
Il existe même certains cadres réseau tels que Netty qui sont presque entièrement configurés, et nous appelons généralement un tel logiciel "Architecture Microker". Quoi que vous le configuriez, c'est ce que c'est.
C'est ce que vous le configurez.
Les formats de fichiers de configuration les plus courants sont XML, les propriétés et autres fichiers.
Cet article traite du scénario le plus courant et le plus commun dans le chargement des configurations, qui est de cartographier un fichier de configuration dans un objet PoJo en Java.
Et explorer comment implémenter différentes façons de charger. Par exemple, certaines configurations sont chargées à partir de fichiers XML locaux, tandis que certaines configurations doivent être chargées à partir de fichiers de propriétés locales.
De plus, certaines configurations doivent être chargées via le réseau.
Comment implémenter un tel mécanisme de chargement de configuration afin qu'après avoir ce mécanisme, la configuration de chargement de code ne sera pas répartie partout, et elle est évolutive et gérable.
Configurer le chargeur
Tout d'abord, nous avons besoin d'un chargeur de configuration, et ce chargeur de configuration peut avoir de nombreuses méthodes de chargement différentes. Par conséquent, nous utilisons une interface pour le décrire comme suit:
/ ** * * * @Author Bean * @Date 21 janvier 2016 à 11:47:12 AM * @version 1.0 * * / interface publique Iconfigloader <T> {/ ** * Chargez la configuration typée par T * * @return * @throws configException * / public t load () lance ConfigException;};Mais pourquoi devons-nous déclarer des génériques <T> sur cette interface?
De toute évidence, lorsque nous voulons utiliser un chargeur de configuration, vous devez dire ce chargeur de configuration quels résultats vous devez obtenir après le chargement.
Par exemple, si vous souhaitez charger la configuration et obtenir un objet AppleConfig, vous pouvez utiliser l'interface définie ci-dessus:
Iconfigloader <PloqueConfig> chargeur = new AppleConFigloader <AppleConFig> ();
AppleConfig config = Loader.Load ();
Vous convertissez donc les informations du fichier de configuration en un objet AppleConfig, et vous pouvez obtenir cette instance d'objet AppleConFig.
Jusqu'à présent, il semble que tant que notre appleconfigloader implémente le travail spécifique de la façon de charger des fichiers de configuration, nous pouvons facilement charger des configurations.
On peut dire que, mais ce n'est pas que la configuration peut être chargée de différentes manières, comme le chargement via les propriétés, DOM, SAX ou le chargement via certaines bibliothèques open source tierces.
Par conséquent, en plus de configurer le chargeur, nous avons également besoin d'un autre rôle, le fournisseur de configuration de la méthode de chargement. Appelons cela iconfigprovider.
Configurer le fournisseur de méthodes de chargement
Le fournisseur de méthodes de chargement de configuration peut fournir une méthode de chargement au chargeur de configuration, en d'autres termes, fournit un objet au chargeur de configuration.
La responsabilité du fournisseur est de fournir, c'est tout, en fournissant uniquement les objets nécessaires pour configurer le chargeur, mais il ne participe pas au travail de configuration du chargement.
Nous utilisons un iconfigprovider d'IconfigProvider pour définir ce fournisseur
/ ** * * * @author bean * @Date 21 janvier 2016 à 11:54:28 AM * @version 1.0 * * / interface publique IconfigProvider <T> {/ ** * Fournit une source de configuration utilisée pour charger la configuration * * @return * @throws configException * / public t fournit () lance configException;}Pourquoi y a-t-il <T> ici pour déclarer des génériques?
Si vous avez besoin d'un fournisseur, vous devez au moins dire au fournisseur ce qu'il devrait fournir.
Par conséquent, ce qu'un fournisseur fournira est déterminé par cela.
Dans le même temps, nous pouvons d'abord construire une usine et la laisser produire des fournisseurs spécifiques:
/ ** * * * @Author Bean * @Date 21 janvier 2016 à 11:56:28 AM * @version 1.0 * * / public class ConfigProviderFactory {private ConfigProviderFactory () {Throw New UnsupportEdOperationException ("inutile d'initialiser une classe d'usine:" + getClass (). getImpLaLName ()); } public static iconfigProvider <Document> CreateDocumentProvider (String filepath) {return new DocumentProvider (filePath); } public static iconfigProvider <Properties> createPropertiesProvider (String filepath) {return new PropertiesProvider (filePath); } public static iconfigProvider <Degester> creatediGesterProvider (String filepath) {return new DigeterProvider (filepath); }}Pouvez-vous commencer à implémenter le chargeur de configuration spécifique?
Pas encore bien!
À ce stade, supposons que nous ayons un fichier de configuration appelé Apple.xml. Et nous devons charger cette Apple.xml dans un objet AppleConfig via DOM.
Donc, tout d'abord, je veux créer un fournisseur qui peut fournir un document via l'usine du fournisseur. Ensuite, je reçois ce fournisseur et je peux appeler sa méthode de fourniture pour obtenir l'objet de document. Avec l'objet document, je peux commencer à charger la configuration.
Cependant, si vous souhaitez charger Bananaconfig, Pearconfig ..., les étapes sont les mêmes. Par conséquent, nous avons également besoin d'une classe abstraite pour implémenter certains comportements communs par défaut.
/ ** * * * @author bean * @Date 21 janvier 2016 à 11:59:19 AM * @version 1.0 * * / public abstrait classe abstractConfigloader <t, u> implémente iconfigloader <t> {protégée iconfigprovider <u> fournisseur; AbstractConfigloader protégé (IconfigProvider <u> fournisseur) {this.provider = fournisseur; } / * * @see iconfigloadher # losh () * / @Override public t Load () lève la configuration {return wad (getProvider (). fournis ()); } Public Résumé T Load (U chargersource) lève la configuration de la configuration; iconfigProvider protégé <u> getProvider () {return this.provider; }}Chaque chargeur de configuration a un constructeur de paramètres qui reçoit un fournisseur.
Le générique indique si je souhaite charger Appleconfig ou Bananconfig. Le générique <u> indique la méthode de chargement à charger, est-ce un document, des propriétés ou autre chose.
Exemples d'application pratiques
Il existe un fichier de configuration du marché végétal Market.xml, qui configure les produits du marché des légumes, y compris deux produits, à savoir les pommes et les œufs.
<MARCHED> <MAPLE> <MOLOR> ROUGE </ COLORD> <CIRD> 100 </ Price> </ Apple> <feg> <eight> 200 </eight> </gg> </sket>
Il existe également un fichier de configuration pour les noms des boss dans chaque stand, propriétaire.properties
Port1 = Steve Jobs
Port2 = Bill Gates
Port3 = Kobe Bryant
Définissons d'abord la classe suivante: MarketConfig.java
/ ** * * * @Author Bean * @Date 21 janvier 2016 à 11:03:37 PM * @version 1.0 * * / classe publique MarketConfig {private AppleConfig AppleConfig; CONFIG PRIVÉ EGGONFIG EGGONFIG; OwnerConfig privé OwnerConfig; public AppleConfig getAppleConfig () {return AppleConfig; } public void setAppleConfig (appleconfig appleconfig) {this.appleConfig = appleConfig; } public eggconfig getEggConfig () {return eggconfig; } public void seteggconfig (eggconfig eggconfig) {this.eggconfig = eggconfig; } Public OwnerConfig getownerConfig () {return OwnerConfig; } public void setownerConfig (propriétaire OwnerConfig OwnerConfig) {this.ownerConfig = OwnerConfig; }}Appleconfig.java
/ ** * * * @author bean * @Date 21 janvier 2016 à 11:03:45 PM * @version 1.0 * * / classe publique AppleConfig {private int prix; couleur de corde privée; public void setPrice (int prix) {this.price = prix; } public int getPrice () {return this.price; } public void setColor (String Color) {this.color = couleur; } public String getColor () {return this.color; }}Eggconfig.java
/ ** * * * @Author Bean * @Date 21 janvier 2016 à 11:03:58 PM * @version 1.0 * * / public class eggconfig {private int poids; public void setweight (int poids) {this.weight = poids; } public int getweight () {return this.weight; }}OwnerConfig.java
/ ** * * * @author bean * @Date 21 janvier 2016 à 11:04:06 PM * @version 1.0 * * / classe publique OwnerConfig {Private Map <String, String> propriétaire = new HashMap <String, String> (); public void addowner (String PortName, propriétaire de chaîne) {this.owner.put (PortName, propriétaire); } public String getownerByPortName (String PortName) {return this.owner.get (portname); } public map <string, string> getowners () {return Collection.UnModifiBeblemAP (this.owner); }}Il existe deux méthodes de chargement de configuration pour cet exemple, à savoir DOM et les méthodes de chargement des propriétés.
Nos fournisseurs doivent donc construire des usines avec deux fournisseurs.
Et deux chargeurs de configuration doivent être définis, à savoir:
OwnerConfigloader
/ ** * * * @Author Bean * @Date 21 janvier 2016 à 11:24:50 PM * @version 1.0 * * / classe publique OwnerConfigloader étend AbstractConfigloader <OwnerConfig, Properties> {/ ** * @param provider * / Protected OwnerConfigloader (IconfigProvider <Propperties> Provider) {Super (Provider); } / * * @see abstractconfigloadher # chargement (java.lang.object) * / @Override public OwnerConfig Load (Properties props) lève la configuration de configuration {OwnerConfig OwnerConfig = new OwnerConfig (); / ** * Utiliser des accessoires pour définir la valeur de propriété de OwnerConfig * * Le code ici est omis * / return OwnerConfig; }}Ensuite, il y a MarketConfigloader
Import Org.W3c.Dom.Document; / ** * * @Author Bean * @Date 21 janvier 2016 à 11:18:56 PM * @version 1.0 * * / public class MarketConfigloader étend AbstractConFigOader <MarketConFig, Document> {/ ** * @Param Provider * / Protected MarketConloder (iConfigProvider <document> {Provider); } / * * AbstractConfigloadher # Load (java.lang.Object) * / @Override public MarketConfig Load (document de document) lève ConfigException {MarketConfig MarketConfig = new MarketConfig (); AppleConfig AppleConfig = new AppleConfig (); Eggconfig eggconfig = new eggconfig (); / ** * Traitez le document ici, puis vous pouvez obtenir * AppleConfig et EggConfg * * Le code ici est omis * / MarketConfig.setAppleConfig (AppleConfig); MarketConfig.SeteggConfig (EggConfig); / ** * Étant donné que OwnerConfig nécessite des propriétés pour se charger, ce n'est pas XML * donc ici, nous devons créer un nouveau OwnerConfigloader et le déléguer pour charger OwnerConfig * / OwnerConFigloader OwnerConFigloader (NewsConConfigloader (configProviderFactory.createPropertiesProvider (your_file_path); OwnerConfig OwnerConfig = OwnerConFigloader.Load (); MarketConfig.SetownerConfig (OwnerConfig); Retour MarketConfig; }}Ensuite, comment pouvons-nous obtenir MarketConfig au niveau de l'application?
MarketConfigloader MarketConfigloader = new MarketConfigloader (configProviderFactory.CreateDocumentProvider (your_file_path)); MarketConfig MarketConfig = MarketConfigloader.Load ();
Il y a peut-être un endroit où les gens peuvent être surpris. Il y a évidemment quatre classes de configuration, alors pourquoi n'y a-t-il que deux chargeurs de configuration? Étant donné que MarketConfig, EggConfig et AppleConfig sont tous chargés à partir du même fichier de configuration XML, tant qu'un objet de document est utilisé, il peut être chargé via MarketConfigloader.
OwnerConfig est une méthode de chargement différente, donc un autre chargeur est nécessaire.
Résumer
Le mécanisme de chargement de configuration proposé dans cet article ne peut pas aider à charger la configuration. Cela devrait être laissé à DOM, SAX et à certaines autres bibliothèques open source telles que Dom4j et Digester. Cependant, le mécanisme de chargement de configuration proposé dans cet article peut rendre le mécanisme de chargement de configuration plus flexible et facile à développer et peut intégrer plusieurs méthodes de chargement de configuration, les intégrer dans un seul mécanisme et jouer leurs propres points.
En fait, certains logiciels doivent souvent charger des configurations à partir de fichiers de configuration de différents formats en même temps, tels que Struts2, et un logiciel de base de données open source domestique que j'ai fait des recherches et de vomir du sang récemment. S'il n'y a pas de mécanisme de chargement de configuration complet, le code sera dispersé et non très maintenable. Cela peut facilement amener les gens à vomir du sang.
Grâce à cet article, j'espère que tout le monde pourra comprendre et maîtriser les connaissances du mécanisme de chargement de la configuration Java. Merci pour votre soutien pour ce site Web!