1

阅读这篇文章,我可以轻松地在网络应用程序中自定义我的环境。

我的自定义非常简单,我在可部署的 war 文件中打包了一些属性文件,我希望在我的 web 服务器机器上有一个本地属性文件,以在重叠的情况下覆盖这些属性。为此,我实现了 ApplicationContextInitializer 接口,加载了我的本地属性文件并使用了我的环境的 addFirst 方法。这确保了我的本地文件覆盖了我的战争中打包的属性文件。

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

到目前为止,我发现的最佳解决方案是在我的配置类中添加一个方法并使用@PostConstruct注释对其进行注释。这个方法和 ApplicationContextInitializer 的初始化方法完全一样。

这个解决方案不能满足我的需求,因为我有一些有条件地加载的 bean,并且这(条件注释代码)发生在我的 @postConstruct 方法之前(这不好,因为条件加载基于我的属性)。

4

2 回答 2

0

对于属性管理,您可以使用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>

当缺少“overrides.properies”时,属性“ignoreResourceNotFound”将保护应用程序免受启动异常的影响。

于 2015-05-04T11:18:05.960 回答
0

我通过加载多个属性源克服了它:

@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 { ... }

这样最后一个属性文件将覆盖以前的属性文件,如此简单..

于 2015-05-11T13:31:46.593 回答