5

我有两个项目,其中一个(服务)包括第二个(核心)。我在 Core 项目中定义了这个 PropertyPlaceholderConfigurer:

<bean id="propertyConfigurer" class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
    <property name="locations">
         <list>
             <value>classpath:appConfig.properties</value>
         </list>
    </property>
</bean>

并且我想在上层项目中扩展Core占位符,包括appConfig.properties和其他一些。我发现的唯一方法是在上层定义另一个不同的bean(不同的ID)并包含新的:

<bean id="servicesPropertyConfigurer" class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
    <property name="locations">
          <list>
                <value>classpath:swagger.properties</value>
          </list>
    </property>
</bean>

但它会导致它找不到 appConfig.properties,我猜它只是同时使用这些 PropertyPlaceholderConfigurer 之一?是否需要在上层propertyConfigurer中指定所有资源?:

<bean id="servicesPropertyConfigurer" class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
    <property name="locations">
          <list>
                <value>classpath:swagger.properties</value>
                <value>classpath:appConfig.properties</value>
          </list>
    </property>
</bean>

是否可以扩展 Core bean o 同时使用两者?

4

2 回答 2

12

您可以同时使用多个,您必须有不同的名称/ID,否则一个会覆盖另一个。接下来,您需要为每个占位符使用不同的占位符 (${...}),或者将其配置为忽略未解析的占位符。

我强烈建议您不要使用类定义,而是使用命名空间 (<context:property-placeholder .. />这会为您节省一些 xml。(它将生成具有唯一名称的 bean,因此您可以同时拥有多个,请确保将ignore-unresolvable属性设置为true.

作为最后的手段,您可以实现您的 aBeanDefinitionRegistryPostProcessor检测所有PropertyPlaceHolderConfigurer实例,将它们合并为一个并将所有位置/资源移动到合并的一个。这样您就不必担心多个不同的占位符或无法解析的属性。

于 2013-09-09T11:27:38.767 回答
4

试试这个代码

<bean id="servicesPropertyConfigurer" class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<property name="locations">
      <list>
            <value>classpath:swagger.properties</value>
            <value>classpath:appConfig.properties</value>
      </list>
</property>
 <property name="ignoreUnresolvablePlaceholders" value="true"/>

于 2013-09-09T11:27:09.377 回答