Spring 3.0 中的多个属性文件

2022-09-02 13:20:52

我正在处理一个具有多个独立模块的项目,每个模块都有自己的应用程序上下文属性文件。我希望能够加载所有这些属性,以便它们可以用于Spring的占位符解析。

前面的问题已经提到了这一点,这里有一篇很好的博客文章,描述了如何在每个上下文中使用PropertyPlaceholderConfigurer,按优先级对它们进行排序,并将overerInresolveablePlaceholders设置为true,以便这些属性文件可以相互交叉引用而不会爆炸。

但是,这并不能解决我的问题,因为我还希望能够使用我正在加载的属性来解析某些自定义占位符(从我正在解析的一些yaml文件中)。这需要使用 PropertyPlaceholderHelper,这需要 Properties 对象作为参数。

据我所知,潜在的解决方案是:

1) 将所有属性文件合并到一个属性 Bean 中。然后,这可以用于创建一个属性占位符配置器(用于Spring的内部占位符解析),并与属性占位符Helper一起使用(用于我自己的占位符解析)

2)以某种方式配置一个ProperagePlaceholderHelper,以使用由ProperagePlaceholderConfigurers持有的属性集及其分层排列,如果我继续并遵循该博客文章的建议。

不幸的是,我无法弄清楚如何做到这两点。任何帮助将不胜感激!

PS看起来春天3.1在这里会是一个很大的帮助...不幸的是,我们还没有准备好搬到它,所以我仍然需要一个解决方案来度过难关!

编辑 ****

感谢您到目前为止的答案。它们是很好的答案,但不幸的是不会帮助我,因为(并为之前没有提到这一点而道歉)我们目前正在将项目的核心模块与非核心模块分开。这意味着核心模块及其应用程序上下文无法对属性文件的名称进行硬编码。令人沮丧的是,Spring的类路径扫描似乎被破坏了,因此“classpath*:*.properties”类型的通配符仅在构建单个模块时有效,而不是顶级项目(我相信这是一个已知问题)。

接下来的问题是如何将非核心模块中定义的属性文件合并到核心模块中定义的现有属性文件中。目前,我正在继续使用BeanPostProcessor - 我只是想知道是否有更简单/更优雅的方法来做到这一点?

谢谢


答案 1

您可以非常轻松地将多个属性文件收集到一个 Bean 中:

<bean id="allProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
  <property name="singleton" value="true"/>
  <property name="ignoreResourceNotFound" value="true"/>
  <property name="locations">
    <list>
      <value>classpath*:default.properties</value>
      <value>classpath*:overrides.properties</value>
      <value>file:${APP_HOME}/**/*.properties</value>
    </list>
  </property>
</bean>

此特定示例将收集APP_HOME中的所有 default.properties、overrides.properties on classpath 和属性文件。现在,您可以从 ProperyPlaceholderConfigurer 或您的自定义后处理器中引用此 Bean。


答案 2

以下代码片段应该可以帮助您入门

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" id="corePlaceHolder">
    <property name="ignoreUnresolvablePlaceholders" value="true"/>
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
    <property name="searchSystemEnvironment" value="true"/>
    <property name="locations">
        <list>
            <value>classpath*:config/*/config1/*.properties</value>
            <value>classpath*:config/*/config2/*.properties</value>
            <value>classpath*:config/*/config3/*.properties</value>
            <value>classpath*:custom.properties</value>
        </list>
    </property>
</bean>     

您可以将属性文件存储在以下层次结构中,以确保可以通过类路径访问配置

config
  config1
     a.properties
  config2
     b.properties
  config3
     c.properties
custom.properties