Préface
Afin de configurer de manière flexible dans des projets, nous utilisons souvent des fichiers de configuration. Les fichiers de configuration communs sont tels que XML et les propriétés. Springboot permet d'utiliser des propriétés et des fichiers YAML comme configurations externes. La prise en charge du compilateur pour la langue YAML n'est pas assez bonne maintenant et le fichier Properties est toujours utilisé comme configuration externe.
Avant que Spring Cloud, la configuration ne soit sortie, j'ai implémenté le centre de configuration basé sur ZK et éliminé le fichier de configuration des propriétés locales. Le principe est très simple, mais je viens de surcharger mergeProperties() de PropertyPlaceHolderConfigurer:
/ ** * Surchargez l'implémentation de la propriété de fusion * D'abord les propriétés de chargement de chargement, puis fusionnez dans les propriétés lues par le ZK Configuration Center * * @return Merged Property Collection * @throws ioexception Exception * / @ OverRideProtected Properties MergeProperties () lance ioException {Properties result = new Properties (); // Chargez la configuration des propriétés de classe parent MergeProperties = super.mergeProperties (); result.putall (MergeProperties); // Chargez la configuration lue à partir de la carte ZK <String, String> configS = LoadzkConfigs (); result.putall (configs); Retour Résultat;} Cette implémentation est assez facile à utiliser dans les projets de printemps, mais récemment, certains projets Spring-Boot ont constaté que cette implémentation d'espace réservé et @ConfigurationProperties(prefix = "xxx") ne peuvent pas bien fonctionner.
Autrement dit, les propriétés ne sont pas résolues, et vous pouvez les lire de manière @Value, mais s'il existe de nombreuses propriétés pour @Value, elle est encore assez lourde. J'ai toujours tendance à utiliser le préfixe de @configurationproperties. J'ai donc regardé la documentation de démarrage de Spring et j'ai trouvé que PropertySource
commande:
* Devtools Global Paramètres Propriétés de votre répertoire domestique (~ / .spring-boot-devtools.properties lorsque Devtools est actif).
* @TestPropertySource Annotations sur vos tests.
* @ Attribut d'annotation des propriétés Springboottest # sur vos tests.
* Arguments de ligne de commande.
* Propriétés de Spring_Application_JSON (en ligne JSON intégrée dans une variable d'environnement ou une propriété système)
* Paramètres init de servletconfig.
* Paramètres init de servletContext.
* Attributs jndi de Java: comp / env.
* Propriétés du système Java (System.GetProperties ()).
* Variables d'environnement OS.
* Une source RandomValuePropertysource qui n'a que des propriétés en aléatoire. *.
* Propriétés d'application spécifiques au profil en dehors de votre pot emballé (application- {profil} .properties et variantes yaml)
* Propriétés d'application spécifiques au profil emballées à l'intérieur de votre pot (application- {profil} .properties et variantes yaml)
* Propriétés d'application en dehors de votre pot emballé (application.properties et variantes YAML).
* Propriétés d'application emballées dans votre pot (application.properties et variantes YAML).
* @Propertysource Annotations sur vos classes @configuration.
* Propriétés par défaut (spécifiées à l'aide de SpringApplication.SetDefaultProperties).
Il n'est pas difficile de constater qu'il peut vérifier les propriétés des propriétés du système Java. C'est-à-dire, écrivez simplement les propriétés lues par MergeProperties dans les accessoires du système Java, consultez le code source et trouvez un point d'entrée.
/ ** * Implémentation de la propriété de traitement de surcharge * Selon les options, décidez si vous devez rédiger les accessoires fusionnés sur les propriétés du système. Spring Boot nécessite * * @param beanfactoryToprocess * @param accessoires Propriétés fusionnées * @Throws BeanSexception * / @ OverRideProtected void processProperties (ConfigurableListableBeanFactory BeanfactoryToprocess, Properties Props) lance BeanSexception {// propeStoral d'origine; // Écrivez sur la propriété système if (writePropStosystem) {// Écrivez toutes les propriétés au système pour Spring Boot Enumeration <?> PropertyNames = props.propertyNames (); while (propriétéNames.hasmoreElements ()) {String PropertyName = (String) propriétéNames.Nexttelement (); String PropertyValue = props.getProperty (propriétéName); System.SetProperty (PropertyName, PropertyValue); }}} Pour éviter un impact excessif, un commutateur est défini pour écrire les propriétés du système. S'il s'agit d'un projet de démarrage de printemps, activez-le, afin de minimiser l'impact sur les projets de démarrage en ligne non ressortissants. Ensuite, @ConfigurationProperties de Spring Boot lisent parfaitement les propriétés;
Voir le code spécifique: org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor
@OverRidePublic Object PostProcessBeforeInitialization (Object Bean, String Beanname) lève BeanSexception {ConfigurationProperties Annotation = AnnotationUtils .Findannotation (bean.getClass (), ConfigurationProperties.Class); if (annotation! = null) {postprocessbeforeInitialization (haricot, beanname, annotation); } annotation = this.beans.findfactoryannotation (beanname, configurationProperties.class); if (annotation! = null) {postprocessbeforeInitialization (haricot, beanname, annotation); } return bean;}Résumer
Ce qui précède est l'intégralité du contenu de cet article. J'espère que le contenu de cet article a une certaine valeur de référence pour l'étude ou le travail de chacun. Si vous avez des questions, vous pouvez laisser un message pour communiquer. Merci pour votre soutien à wulin.com.