不幸的是,这比它应该的要困难得多。在我的应用程序中,我通过执行以下操作实现了这一点:
一个小型的“引导”上下文,负责加载一个 PropertyPlaceholderConfigurer Bean 和另一个负责引导应用程序上下文的 Bean。
上面提到的第二个bean将“真正的”spring上下文文件作为输入来加载。我整理了我的弹簧上下文文件,以便可配置部分是众所周知的并且在同一位置。例如,我可能有3个配置文件:one.onpremise.xml,one.hosted.xml,one.multitenant.xml。Bean 以编程方式将这些上下文文件加载到当前应用程序上下文中。
这是有效的,因为上下文文件被指定为负责加载它们的bean的输入。正如你所提到的,如果你只是尝试做一个导入,它将不起作用,但这具有相同的效果,稍微多一点的工作。引导类如下所示:
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();
}
}
基本上,获取应用程序上下文,设置其配置位置,并告诉它刷新自身。这在我的应用程序中完美地工作。
希望这有帮助。