使用Spring上下文中的默认路径从系统属性加载属性文件

时间:2015-06-04 09:45:03

标签: spring

我正在尝试使用来自系统属性的路径在Spring上下文中加载属性文件(位于战争之外)。

如果该系统属性不存在或找不到路径,我想回退到.war中包含的默认属性文件。

以下是我的applicationContext.xml的具体部分

MyDomain

问题是,当在系统属性中找不到config.dir时,会抛出异常,说解析器无法找到该属性。

即使它会解决的情况,我很确定第二行会使参数中给出的文件中加载的属性被默认文件中的属性替换,这与我的相反想做。

我使用Spring 4.x只配置xml。

有可能做我想要的吗? 我知道基于Java的配置的@Conditional,但我只能使用xml方式来响应项目的标准。

1 个答案:

答案 0 :(得分:2)

不要使用2个占位符,只使用一个占位符,location属性需要加载,个分隔的文件列表。

<context:property-placeholder ignore-resource-not-found="true" location="file:${config.dir}/config/server.properties,classpath:config/server.properties"/>

但是config.dir属性必须可用,否则加载会爆炸。

另一种解决方案是使用ApplicationContextInitializer并根据config.dir属性加载的可用性来加载附加文件。

public class ConfigInitializer implements ApplicationContextInitializer {

    public void initialize(ConfigurableApplicationContext applicationContext) {
        ConfigurableEnvironment env = applicationContext.getEnvironment();
        MutablePropertySources mps = env.getPropertySources();

        mps.addLast(new ResourcePropertySource("server.properties", "classpath:config/server.properties"));

        if (env.containsProperty("config.dir")) {
            String configFile = env.getProperty("config.dir")+"/config/server.properties";
            Resource resource = applicationContext.getResource(configFile);
            if (resource.exists() ) {
                mps.addBefore("server.properties", new ResourcePropertySource(resource));
            }
        }
    }
}

现在您只需要一个空的<context:property-placeholder />元素。

增加的优势是您可以在默认属性中指定默认config.dir,并由系统或环境属性覆盖。