自定义 属性 管理 Spring 4.x

Custom Property Management with Spring 4.x

正在网络应用程序中阅读 this and that I could easily customize my environment

我的定制非常简单,我有一些 属性 文件打包在我的可部署 war 文件中,我想在我的网络服务器机器上有一个本地属性文件来覆盖这些文件重叠情况下的属性。为此,我实现了 ApplicationContextInitializer 接口,加载了我的本地属性文件并使用了 environment 的 addFirst 方法。这确保了我的本地文件覆盖了我的 war.

中打包的属性文件

这非常有效。现在我想在 java-spring 进程(不是网络应用程序)中做同样的事情,我该怎么做?

到目前为止我找到的最佳解决方案是在我的 configuration class and annotate it with the @PostConstruct 注释中添加一个方法。此方法与 ApplicationContextInitializer 的初始化方法完全相同。

这个解决方案不能满足我的需要,因为我有一些 bean 是 loaded conditionally and this (the conditional annotation 代码)发生在我的 @postConstruct 方法之前(这不好,因为条件加载是基于我的属性)。

对于属性管理,您可以使用 PropertyPlaceholderConfigurer,这使您能够以适当的顺序加载 属性 文件并覆盖。 在 XML 表单中,您的配置将如下所示:

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

属性 "ignoreResourceNotFound" 将在缺少 "overrides.properies" 时防止应用程序出现启动异常。

我通过加载多个 属性-来源克服了这个问题:

@Configuration
@ComponentScan("com.company.project")
@PropertySources({ @PropertySource(value = "classpath:/my-jar-properties-file.properties", ignoreResourceNotFound = false),
    @PropertySource(value = "file:/path/to/file/local.filesystem.properties.file.properties", ignoreResourceNotFound = false) })
public class MyConfiguration { ... }

这样最后一个属性文件就会覆盖之前的,就这么简单..