C'est, malheureusement, beaucoup plus difficile qu'elle ne devrait l'être. Dans mon application j'ai accompli cela en procédant comme suit:
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.
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.