Comment injecter une valeur de propriété dans un Spring Bean qui a été configuré à l'aide d'annotations ?

J'ai un tas de beans Spring qui sont récupérés dans le classpath par le biais d'annotations, par ex.

@Repository("personDao")
public class PersonDaoImpl extends AbstractDaoImpl implements PersonDao {
    // Implementation omitted
}

Dans le fichier XML de Spring, un [PropertyPlaceholderConfigurer][1] est défini :

<bean id="propertyConfigurer" 
  class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="/WEB-INF/app.properties" />
</bean>   

Je veux injecter l'une des propriétés de app.properites dans le bean présenté ci-dessus. Je ne peux pas simplement faire quelque chose comme

<bean class="com.example.PersonDaoImpl">
    <property name="maxResults" value="${results.max}"/>
</bean>

Parce que PersonDaoImpl ne figure pas dans le fichier XML de Spring (il est récupéré dans le classpath via les annotations). Je suis arrivé jusqu'à ce qui suit :

@Repository("personDao")
public class PersonDaoImpl extends AbstractDaoImpl implements PersonDao {

    @Resource(name = "propertyConfigurer")
    protected void setProperties(PropertyPlaceholderConfigurer ppc) {
    // Now how do I access results.max? 
    }
}

Mais je ne vois pas très bien comment accéder à la propriété qui m'intéresse à partir de ppc ?

[1] : http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/beans/factory/config/PropertyPlaceholderConfigurer.html

Une autre alternative consiste à ajouter le haricot appProperties présenté ci-dessous :










                        ${results.max}


Une fois récupéré, ce bean peut être transformé en un java.util.Properties qui contiendra une propriété nommée results.max dont la valeur est lue depuis app.properties. Encore une fois, ce bean peut être injecté par dépendance (en tant qu'instance de java.util.Properties) dans n'importe quelle classe via l'annotation @Resource.

Personnellement, je préfère cette solution (à l'autre que j'ai proposée), car vous pouvez limiter exactement les propriétés qui sont exposées par appProperties, et vous n'avez pas besoin de lire app.properties deux fois.

Commentaires (1)

J'ai besoin de deux fichiers de propriétés, un pour la production et un autre pour le développement (qui ne sera pas déployé).

Pour avoir les deux, un Properties Bean qui peut être autoprogrammé et un PropertyConfigurer, vous pouvez écrire :







            classpath:live.properties
            classpath:development.properties


et référencer le Properties Bean dans le PropertyConfigurer.



Commentaires (0)

Une solution possible est de déclarer un deuxième bean qui lit à partir du même fichier de propriétés :





Le bean nommé 'appProperties&#39 ; est de type java.util.Properties et peut être injecté en dépendance à l'aide de l'attruibute @Resource montré ci-dessus.

Commentaires (0)