Comment lire la variable d’environnement System dans Spring applicationContext

Comment lire la variable d’environnement système dans le contexte de l’application?

Je veux quelque chose comme:

 

ou

  

en fonction de l’environnement.

Puis-je avoir quelque chose comme ceci dans mon contexte d’application?

  

où la valeur réelle est définie en fonction de la variable System Environment

J’utilise Spring 3.0

Vérifiez cet article . Cela vous donne plusieurs façons de le faire, via le PropertyPlaceholderConfigurer qui prend en charge les propriétés externes (via la propriété systemPropertiesMode ).

Vous êtes proches: o) Spring 3.0 ajoute le langage d’expression Spring . Vous pouvez utiliser

  

Combiné avec java ... -Denv=QA devrait résoudre votre problème.

Notez également un commentaire de @yiling:

Pour accéder à la variable d’environnement système, c’est-à-dire les variables de niveau OS comme Amoe a commenté, nous pouvons simplement utiliser “systemEnvironment” au lieu de “systemProperties” dans cette EL. Comme #{systemEnvironment['ENV_VARIABLE_NAME']}

De nos jours, vous pouvez mettre

 @Autowired private Environment environment; 

dans votre @Component , @Bean , etc., puis accédez aux propriétés via la classe Environment :

 environment.getProperty("myProp"); 

Pour une seule propriété dans un @Bean

 @Value("${my.another.property:123}") // value after ':' is the default Integer property; 

@ConfigurationProperties haricots @ConfigurationProperties :

 @ConfigurationProperties(prefix="my.properties.prefix") public class MyProperties { // value from my.properties.prefix.myProperty will be bound to this variable Ssortingng myProperty; // and this will even throw a startup exception if the property is not found @javax.validation.constraints.NotNull Ssortingng myRequiredProperty; //getters } @Component public class MyOtherBean { @Autowired MyProperties myProperties; } 

Remarque: n’oubliez pas de redémarrer eclipse après avoir défini une nouvelle variable d’environnement

Oui, vous pouvez par exemple faire .

La variable systemProperties est prédéfinie, voir 6.4.1 Configuration basée sur XML .

Dans votre définition de bean, assurez-vous d’inclure “searchSystemEnvironment” et définissez-le sur “true”. Et si vous l’utilisez pour créer un chemin vers un fichier, spécifiez-le en tant que fichier: /// URL.

Par exemple, si vous avez un fichier de configuration situé dans

 /testapp/config/my.app.config.properties 

puis définissez une variable d’environnement comme suit:

 MY_ENV_VAR_PATH=/testapp/config 

et votre application peut charger le fichier en utilisant une définition de bean comme celle-ci:

par exemple

         file:///${MY_ENV_VAR_PATH}/my.app.config.properties    

En utilisant Spring EL, vous pouvez par exemple écrire comme suit

     

Pour mon cas d’utilisation, je devais accéder uniquement aux propriétés du système, mais fournir des valeurs par défaut au cas où elles ne seraient pas définies.

Voici comment vous le faites:

         

Déclarez le détenteur de la propriété comme suit

     file:///path.to.your.app.config.properties    

Alors disons que vous voulez lire System.property("java.io.tmpdir") pour votre bean Tomcat ou n’importe quel bean puis ajoutez les éléments suivants dans votre fichier de propriétés:

 tomcat.tmp.dir=${java.io.tmpdir} 

Voici comment vous le faites:

      dev    

Mais rappelez-vous que le spring est chargé en premier, puis il chargera ce bean MethodInvokingFactoryBean. Donc, si vous essayez d’utiliser ceci pour votre scénario de test, assurez-vous que vous utilisez depend-on. Pour par exemple dans ce cas

Si vous l’utilisez pour votre classe principale mieux définir cette propriété en utilisant votre pom.xml comme

  deployment.env dev  

Vous pouvez mentionner vos atsortingbuts de variable dans un fichier de propriétés et définir des fichiers de propriétés spécifiques à l’environnement, tels que local.properties, production.propertied, etc.

Maintenant, en fonction de l’environnement, l’un de ces fichiers de propriétés peut être lu dans l’un des écouteurs appelés au démarrage, comme ServletContextListener.

Le fichier de propriétés contiendra les valeurs spécifiques à l’environnement pour différentes clés.

Exemple de “local.propities”

 db.logsDataSource.url=jdbc:mysql://localhost:3306/logs db.logsDataSource.username=root db.logsDataSource.password=root db.dataSource.url=jdbc:mysql://localhost:3306/main db.dataSource.username=root db.dataSource.password=root 

Exemple de “production.properties”

 db.logsDataSource.url=jdbc:mariadb://111.111.111.111:3306/logs db.logsDataSource.username=admin db.logsDataSource.password=xyzqer db.dataSource.url=jdbc:mysql://111.111.111.111:3306/carsinfo db.dataSource.username=admin db.dataSource.password=safasf@mn 

Pour utiliser ces fichiers de propriétés, vous pouvez utiliser REsource comme indiqué ci-dessous.

  PropertyPlaceholderConfigurer configurer = new PropertyPlaceholderConfigurer(); ResourceLoader resourceLoader = new DefaultResourceLoader(); Resource resource = resourceLoader.getResource("classpath:"+System.getenv("SERVER_TYPE")+"DB.properties"); configurer.setLocation(resource); configurer.postProcessBeanFactory(beanFactory); 

SERVER_TYPE peut être défini comme variable d’environnement avec les valeurs appropriées pour l’environnement local et de production.

Avec ces modifications, le appplicationContext.xml aura les modifications suivantes

      

J’espère que cela t’aides .

Merci à @Yiling. C’était un indice.

      file:#{systemEnvironment['FILE_PATH']}/first.properties file:#{systemEnvironment['FILE_PATH']}/second.properties file:#{systemEnvironment['FILE_PATH']}/third.properties    

Après cela, vous devriez avoir une variable d’environnement nommée ‘FILE_PATH’. Assurez-vous de redémarrer votre ordinateur après avoir créé cette variable d’environnement.

Pour obtenir une valeur de variable système, utilisez Simpy ci-dessous:

 System.getenv("property-name");