Property Configurer

Cette page a été rédigée il y a fort fort longtemps, et n'a pas tellement été mise à jour.

 

Vous savez, moi je ne crois pas qu'il y ait de bonne ou de mauvaise page. Moi, si je devais résumer mon wiki aujourd'hui avec vous, je dirais que c'est d'abord des rencontres. Des gens qui m'ont tendu la main, peut-être à un moment où je ne pouvais pas, où j'étais seul chez moi. Et c'est assez curieux de se dire que les hasards, les rencontres forgent une destinée... Parce que quand on a le goût de la chose, quand on a le goût de la chose bien faite, le beau geste, parfois on ne trouve pas l'interlocuteur en face je dirais, le miroir qui vous aide à avancer. Alors ça n'est pas mon cas, comme je disais là, puisque moi au contraire, j'ai pu ; et je dis merci au wiki, je lui dis merci, je chante le wiki, je danse le wiki... je ne suis qu'amour ! Et finalement, quand des gens me disent « Mais comment fais-tu pour avoir cette humanité ? », je leur réponds très simplement que c'est ce goût de l'amour, ce goût donc qui m'a poussé aujourd'hui à entreprendre une construction logicielle... mais demain qui sait ? Peut-être simplement à me mettre au service de la communauté, à faire le don, le don de soi.

Comment remplacer dynamiquement les propriétés d’un bean Spring ?

Remplacement de propriétés

La technique traditionnelle pour externaliser les valeurs de propriétés d’un bean est d’utiliser le post-processeur PropertyPlaceholderConfigurer.

<bean id="dataSource"
      class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <property name="driver"><value>${jdbc.driver}</value></property>
  <property name="url"><value>${jdbc.url}</value></property>
  <property name="user"><value>${jdbc.user}</value></property>
  <property name="password"><value>${jdbc.password}</value></property>
</bean>

<bean id="placeholder"
      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="location"><value>jdbc.properties</value></property>
</bean>
# Fichier jdbc.properties
jdbc.driver=org.hsqldb.jdbcDriver
jdbc.url=jdbc:hsqldb:hsql://localhost
jdbc.user=sa
jdbc.password=

Redéfinition de propriétés

Il est possible de faire une manipulation similaire, sans la logique de placeholder, mais en écrasant les valeurs définies dans le bean, avec le PropertyOverrideConfigurer

<bean id="dataSource"
      class="org.apache.commons.dbcp.BasicDataSource"
      destroy-method="close">
  <property name="driverClassName" value="org.hsqldb.jdbcDriverx" />
  <property name="url" value="jdbc:hsqldb:hsql://localhost/XXX" />
  <property name="username" value="sax" />
  <property name="password" value="xxx" />
</bean>

<bean id="placeholder"
      class="org.springframework.beans.factory.config.PropertyOverrideConfigurer">
  <property name="location">
    <value>jdbc.properties</value>
  </property>
</bean>

Les propriétés enregistrées dans le fichier font référence aux propriétés du bean sur la construction beanName.propertyName :

# Fichier jdbc.properties
dataSource.driverClassName=org.hsqldb.jdbcDriver
dataSource.url=jdbc:hsqldb:hsql://localhost
dataSource.username=sa
dataSource.password=

Chargement personnalisé de propriétés

Dans les deux cas, il est possible d’aller plus loin dans la personnalisation des propriétés, en utilisant un bean personnel de propriétés.

<bean id="dsProperties"
      class="fr.sewatech.university.utils.DatasourceProperties" />

<bean id="placeholder"
      class="org.springframework.beans.factory.config.PropertyOverrideConfigurer">
  <property name="properties" ref="dsProperties"/>
</bean>

Dans ce cas, les propriétés ne sont plus forcément stockées en fichier, mais sont gérée dans le constructeur de notre classe DatasourceProperties.

// Fichier DatasourceProperties.java
package fr.sewatech.university.utils;

import java.util.Properties;

public class DatasourceProperties extends Properties {

  private static final long serialVersionUID = -2672136808054763735L;

  public DatasourceProperties() {
    this.put("datasource.driverClassName", "org.hsqldb.jdbcDriver");
    this.put("datasource.url", "jdbc:hsqldb:hsql://localhost");
    this.put("datasource.username", "sa");
    this.put("datasource.password", "");
  }
}

Dans l’exemple ci-dessus, les propriétés sont codées en dur dans le constructeur ; il est évident que nous pouvons remplacer cette portion de code par l’accès à un bean injecté, ou )ar un accès direct à une base de données.