34 votes

Importer le fichier de configuration Spring en fonction de la propriété du fichier .properties

Dans mon Printemps xml de configuration, je vais essayer d'obtenir quelque chose comme ceci fonctionne:

<beans>

   <import resource="${file.to.import}" />

   <!-- Other bean definitions -->

</beans>

Je veux décider quels sont les fichiers à importer basée sur une propriété dans un fichier de propriétés. Je sais que je peux utiliser un Système de propriété, mais je ne peux pas ajouter une propriété à la JVM au démarrage.

Remarque: Le PropertyPlaceHolderConfigurer aura pas de travail. Les importations sont résolus avant tout BeanFactoryPostProcessors sont exécutés. L'importation de l'élément ne peut résoudre le Système.les propriétés.

Quelqu'un aurait-il une solution simple pour cela? Je ne veux pas commencer à dériver les classes du framework et ainsi de suite...

Merci

15voto

Louis Marascio Points 1449

C'est, malheureusement, beaucoup plus difficile qu'elle ne devrait l'être. Dans mon application j'ai accompli cela en procédant comme suit:

  1. Un petit "bootstrap" contexte qui est responsable du chargement d'un PropertyPlaceholderConfigurer bean et un autre bean qui est responsable de l'amorçage du contexte de l'application.

  2. La 2ème bean mentionné ci-dessus prend comme entrée le "vrai" printemps contexte fichiers à charger. J'ai mon printemps contexte fichiers organisés de telle sorte que l'configurable partie est bien connu, et dans le même lieu. Par exemple, j'ai 3 fichiers de configuration: one.onpremise.xml, one.hosted.xml, one.multitenant.xml. Le haricot par programmation charges de ces contexte fichiers dans l'actuel contexte de l'application.

Cela fonctionne parce que le contexte fichiers sont spécifiés à l'entrée de la fève responsable de leur chargement. Il ne fonctionnera pas si vous essayez juste de faire un import, comme vous l'avez mentionné, mais cela a le même effet avec un peu plus de travail. La classe de bootstrap ressemble à quelque chose comme ceci:

 public class Bootstrapper implements ApplicationContextAware, InitializingBean {

    private WebApplicationContext context;
    private String[] configLocations;
    private String[] testConfigLocations;
    private boolean loadTestConfigurations;

    public void setConfigLocations(final String[] configLocations) {
        this.configLocations = configLocations;
    }

    public void setTestConfigLocations(final String[] testConfigLocations) {
        this.testConfigLocations = testConfigLocations;
    }

    public void setLoadTestConfigurations(final boolean loadTestConfigurations) {
        this.loadTestConfigurations = loadTestConfigurations;
    }

    @Override
    public void setApplicationContext(final ApplicationContext applicationContext) throws BeansException {
        context = (WebApplicationContext) applicationContext;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        String[] configsToLoad = configLocations;

        if (loadTestConfigurations) {
            configsToLoad = new String[configLocations.length + testConfigLocations.length];
            arraycopy(configLocations, 0, configsToLoad, 0, configLocations.length);
            arraycopy(testConfigLocations, 0, configsToLoad, configLocations.length, testConfigLocations.length);
        }

        context.setConfigLocations(configsToLoad);
        context.refresh();
    }
}

Fondamentalement, obtenir le contexte de l'application, définissez sa config endroits, et le dire à actualiser lui-même. Cela fonctionne parfaitement dans mon application.

Espérons que cette aide.

6voto

István Points 357

Pour les Spring 2.5 et 3.0, j'ai une solution similaire à louis, mais je viens de lire la prochaine fonctionnalité de 3.1: la gestion des propriétés , qui sonne bien aussi.

5voto

Ian Brandt Points 81

Il existe un ancien problème sur Spring JIRA pour l'ajout de la prise en charge des espaces réservés des propriétés pour l'importation (SPR-1358) qui a été résolu comme «ne sera pas résolu», mais il existe depuis une proposition de solution utilisant un EagerPropertyPlaceholderConfigurer.

J'ai fait du lobbying pour que le SPR-1358 soit rouvert, mais aucune réponse jusqu'à présent. Peut-être que si d'autres ajoutaient leurs cas d'utilisation aux commentaires sur le problème, cela aiderait à accroître la sensibilisation.

2voto

Brian Agnew Points 143181

Pourquoi pas:

  1. lire votre fichier de propriétés au démarrage
  2. qui déterminera quelle configuration Spring charger
  3. quelle que soit la configuration Spring chargée, définit des éléments spécifiques, puis charge une configuration Spring commune

vous inversez donc efficacement la solution que vous proposez actuellement.

1voto

laz Points 12212

Ajoutez quelque chose de semblable au suivant:

 <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="ignoreResourceNotFound"><value>true</value></property>
    <property name="locations">
        <list>
            <value>classpath:propertyfile.properties</value>
        </list>
    </property>
</bean>
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X