La couverture de configuration est meilleure que le profil
Dans la pratique de la production, la couverture de configuration est une méthode courante pour résoudre différentes configurations dans différents environnements. Par exemple, utilisez des fichiers de configuration sur le serveur de production pour écraser les fichiers du package ou utiliser un service de configuration centralisé pour écraser la configuration commerciale par défaut.
Par rapport au mécanisme de profil (tel que le profil de Maven et les propriétés spécifiques au profil de Spring Boot), différents environnements utilisent différents fichiers de configuration et la méthode de superposition est plus avantageuse. Les programmeurs n'ont pas besoin de se soucier de l'adresse, du compte et d'autres informations de la base de données de l'environnement de production pendant le développement. Ils peuvent fonctionner dans différents environnements en construisant à la fois. Le mécanisme de profil doit écrire la configuration de l'environnement de production dans le fichier de ressources du projet, et différents paramètres de construction ou paramètres de fonctionnement doivent être utilisés pour différents environnements.
Spring fournit des capacités d'extension de configuration flexibles, avec plusieurs façons d'intégrer des sources d'attribut personnalisées, ce qui permet une couverture de configuration facile.
Cet article est écrit sur la base de Spring Boot 1.4.8 / Spring 4.3.12
Utilisez @propertysource Annotation pour implémenter des fichiers de configuration personnalisés et une priorité de configuration
@ ConfigurationProperties @ ConfigurationPublic Class Demoproperties {// Propriétés avec Getter / Setters} @Propertysource (value = {"test.properties", "file: /etc/test.properties",}, ignoreResourCenotFound = true) @configurationpublic classe DemoAutoConfiguration {@autowired private Demoproperties DemoProperties; @PostConstruct public void init () {System.out.println (démoproperties); }}Spring prend en charge l'introduction de fichiers de configuration personnalisés à l'aide des annotations de propriété, où "test.properties" fera charger le fichier de Spring à partir du fichier classpath, "file: /etc/test.properties" fera charger le Spring pour charger le /etc/test.properties à partir du système de fichiers, IgnoreResourCenotfound = true fait le printemps ignorer l'exception de l'échec de la charge de fichiers, qui est le fichier de configuration.
En même temps, puisque "File: /etc/test.properties" est situé après "test.properties", cela permet au fichier de configuration du système de fichiers d'écraser la configuration sous ClassPath.
Usine de source de propriété personnalisée
Si vous souhaitez personnaliser la source de propriété plus flexible, telles que le chargement des configurations à partir d'un service de configuration centralisé, vous pouvez implémenter l'interface PropertySourceFactory et configurer les paramètres d'usine de l'annotation PropertySource.
@ Configuration @ propriétéSource (value = "" / * placeholder * /, factory = CompositePropertySourceFactory.class) Classe publique CompositeConfigAutoConfiguration {}Le champ de valeur est utilisé pour spécifier le fichier de ressources correspondant à la source de configuration. Si le fichier de ressources n'est pas requis, il peut être configuré comme n'importe quelle valeur. La valeur du paramètre sera transmise à la méthode CreatePropertySource du paramètre d'usine.
Si le champ IgnoreResourCenotFound est spécifié comme vrai, l'exception jetée par l'usine sera ignorée, sinon elle entraînera l'échec du démarrage. Parfois, c'est une bonne pratique d'exposer directement l'échec du démarrage.
La définition de l'interface PropertySourceFactory est la suivante:
/ ** * Interface de stratégie pour la création de wrappers {@Link PropertySource}. * * @Author Juergen Hoeller * @Since 4.3 * @SeE DefaultPropertySourceFactory * / Interface publique PropertySourceFactory {/ ** * Créer un {@Link PropertySource} qui enveloppe la ressource donnée. * @param nomme le nom de la source de propriété * @param ressource la ressource (potentiellement encodé) pour envelopper * @return le nouveau {@Link PropertySource} (jamais {@code null}) * @throws ioException if Resolution Resolution Failli * / PropertySource <?> CreatepRepertySource (Nom de la chaîne, Resolution EncodedReSourceIl convient de noter que le temps de chargement de PropertySourceFactory est plus tôt que celui des conteneurs de haricots de ressort, de sorte que l'implémentation ne peut pas dépendre du CIO de Spring.
PropertySourceFactory exige que la classe d'implémentation renvoie PropertySource. PropertySource est l'interface centrale de la fonction (ou configuration) de la propriété Spring, et a de nombreuses implémentations, telles que:
Les classes de mise en œuvre réelles sont bien inférieures à celles-ci. À des fins spécifiques, vous pouvez lire la documentation Spring ou le code source.
MAPPROPERTYSOURCE et CompositEpropertySource sont couramment utilisés lors de la personnalisation des sources de propriétés.
MAPPROPERTYSOURCE peut être utilisé pour envelopper les données de propriété qu'elle se charge, se référer à sa méthode de construction.
public MappRopertySource (nom de chaîne, map <string, objet> source) {super (nom, source);}Ce dernier peut charger plusieurs sources d'attribut en combinant et en personnalisant l'ordre de remplacement. Par exemple:
PropertySource <?> PackageInSidepropertySource = packageIndepropertySourceiterateLoader.LoadPropertySource (CompositePropertySource); CompositEpropertySource.AddPropertySource (packinIntepropertySource); PropertySource <?> OuterFilePropertySource = OUTERFILEPROPERTYSOURCEIERATELADER.LoadpropertySource (CompositePropertySource); // la priorité est plus élevée que l'ancienne est la plus élevée que l'ancienne est la plus élevée que l'ancienne est plus élevée que l'ancienne est plus élevée que l'ancien est plus élevé que l'ancien est plus élevé que l'ancien est plus élevé que l'ancien est plus élevé que l'ancien est plus élevé que l'ancien est plus élevé que l'ancien est supérieur à l'ancien est supérieur à l'ancien est plus élevé que l'ancien est l'ancien est plus CompositEpropertySource.AddFirstPropertySource (OuterFilePropertySource);
La méthode AddFirstPropertySource peut définir la propriété entrante à la priorité la plus élevée (à l'intérieur de cette composition de composition de source), et la méthode AddPropertySource est l'inverse, et la priorité est plus faible par la suite.
Chargez tous les fichiers de configuration avec le même nom dans le package JAR de dépendance
Le chargement du fichier de configuration directement à partir du ClassPath exige que le fichier doit exister dans le chemin de classe. Considérez dans un projet Web, si le fichier existe dans un package JAR de dépendance, c'est-à-dire qu'il est situé dans Web-Inf / lib / xxx.jar, il ne peut pas être chargé directement sur le chemin de classe. À l'heure actuelle, vous pouvez utiliser le PathMatchingResourcePatternResolver fourni par Spring pour scanner tous les packages JAR par nom de ressource pour atteindre l'objectif.
Liste privée <Source> getPackageInsideResourcesByPattern (String ResourceName) lève ioException {String ResourcePathPattern = ResourcePatterNResolver.ClassPath_ALL_URL_PREFIX + HbootConfigConSants.Configs + ResourceName; ResourcePatterNResolver ResourcePatterNResolver = new PathMatchingResourcePatterNResolver (); return arrays.aslist (ResourcePatterNResolver.getResources (ResourcePathPattern));} Ensuite, vous pouvez utiliser ResourcePropertySource pour construire PropertySource de Resource pour passer au printemps.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.