基于 .properties 文件中的属性导入 Spring 配置文件

2022-09-01 07:51:38

在我的Spring xml配置中,我试图让这样的东西工作:

<beans>

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

   <!-- Other bean definitions -->

</beans>

我想根据属性文件中的属性决定要导入哪个文件。我知道我可以使用 System 属性,但无法在启动时向 JVM 添加属性。

注意:PropertyPlaceHolderConfigurer 将不起作用。导入在运行任何 BeanFactoryPostProcessors 之前解析。导入元素只能解析 System.properties。

有没有人有一个简单的解决方案?我不想开始子类化框架类等等...

谢谢


答案 1

不幸的是,这比它应该的要困难得多。在我的应用程序中,我通过执行以下操作实现了这一点:

  1. 一个小型的“引导”上下文,负责加载一个 PropertyPlaceholderConfigurer Bean 和另一个负责引导应用程序上下文的 Bean。

  2. 上面提到的第二个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();
    }
}

基本上,获取应用程序上下文,设置其配置位置,并告诉它刷新自身。这在我的应用程序中完美地工作。

希望这有帮助。


答案 2

对于Spring 2.5和3.0,我有一个与louis类似的解决方案,但是我刚刚读到3.1即将推出的功能:物业管理,这听起来也很棒。


推荐