web-dev-qa-db-fra.com

Remplacer les propriétés du fichier de propriétés externe s'il existe à l'aide de Spring

Le fichier de propriétés suivant est défini dans l'un de mes fichiers de configuration Spring:

<context:property-placeholder location="classpath:project.properties"/> 

Maintenant, je veux remplacer quelques propriétés d'un fichier de propriétés externe qui ne se trouve pas dans le chemin d'accès aux classes.

Disons que mon projet est déployé quelque part et que j'ai besoin d'un changement de configuration dynamique. Je ne veux pas mettre à jour le code base du projet dans le conteneur (Tomcat ou autre). 

1.) J'ai donc besoin d'un moyen qui mette à jour (remplace) les valeurs du fichier de propriétés chargé de spring avec mes dernières mises à jour dans le fichier de propriété externe.

2.) Ce serait bien si quelqu'un pouvait également partager le moyen d'actualiser les propriétés préchargées. 

28
Saurab Parakh

J'ai donc besoin d'un moyen qui mette à jour (remplace) les valeurs du fichier de propriétés chargé de spring avec mes mises à jour récentes dans le fichier de propriétés externe.

Vous pouvez utiliser le PropertyPlaceholderConfigurer .

Si vous voulez utiliser l’espace de noms context

<context:property-placeholder location="classpath:yourClasspath.properties,file:/some/resource/path/filePropertiesToOverride.properites"/> 

ou de cette façon

<bean id="placeholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath:yourClasspath.properties</value>
            <value>file:/some/resource/path/filePropertiesToOverride.properites</value>
        </list>
    </property>
</bean>

Selon le javadoc de PropertiesLoaderSupport.setLocations (Resource [])

... Remarque: Les propriétés définies dans les fichiers ultérieurs remplacent les propriétés définies dans les fichiers précédents, en cas de chevauchement des clés. Par conséquent, assurez-vous que les fichiers les plus spécifiques sont les derniers de la liste d'emplacements donnée.

.

Ce serait formidable si quelqu'un pouvait également partager le moyen d'actualiser les propriétés préchargées. 

Pour le moment, vous utilisez une variable PropertyPlaceholderConfigurer. Etant donné qu'une PropertyPlaceholderConfigurer est une BeanFactoryPostProcessor, elle traverse les définitions de bean (représentation de l'objet du beans.xml) et remplace les chaînes de propriété (telles que $ {someProp}). Après cela, les beans sont instanciés et initialisés. Il n'y a donc aucun moyen de "recharger" les propriétés.

Il y a encore plus à considérer si vous souhaitez créer une application pouvant réagir aux modifications de propriétés au moment de l'exécution:

  • Comment pouvez-vous déclencher le changement au runtime? Par exemple. une minuterie qui interroge un fichier de propriétés sur les modifications, JMX, ...?
  • Comment les classes dépendantes des propriétés sont-elles informées de la mise à jour? Par exemple. une implémentation d'auditeur.
  • Comment synchroniser les mises à jour de nombreuses propriétés dépendantes? Par exemple. Imaginez ce qui se passera si les propriétés sont mises à jour lors d'une demande d'application Web sans synchronisation. Une partie de la demande peut utiliser les anciennes et les nouvelles propriétés.

Au moins, je recommanderais d'utiliser Apache commons configuration . Mais ce n’est qu’un cadre qui résout quelques problèmes et il vous reste à réfléchir aux solutions aux problèmes ci-dessus.

34
René Link

au printemps botte 2, c'est 

Java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties

Vous pouvez obtenir tous les détails dans https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

0
krmanish007