来自另一个属性的属性占位符位置

IT小君   2021-10-27T02:38:35

我需要从程序运行之前我不知道的位置将一些属性加载到 Spring 上下文中。

所以我想,如果我有一个没有位置的 PropertyPlaceholderConfigurer,它会my.location从系统属性中读取,然后我可以在上下文中使用该位置:property-placeholder

像这样

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>    
<context:property-placeholder location="${my.location}"/>

但这不起作用,也不起作用 location="classpath:${my.location}"

保罗

点击广告,支持我们为你提供更好的服务
评论(2)
IT小君

您可以使用稍微不同的方法来做到这一点。这是我们如何配置它。我加载默认属性,然后使用可配置位置的属性覆盖它们。这对我来说非常有效。

<bean id="propertyPlaceholderConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
        <property name="locations">
            <list>
                <value>classpath:site/properties/default/placeholder.properties
                </value>
                <value>classpath:site/properties/${env.name}/placeholder.properties
                </value>
            </list>
        </property>
    </bean>
2021-10-27T02:38:35   回复
IT小君

这里的问题是您正在尝试使用属性占位符语法配置属性占位符 :) 这有点像鸡和蛋的情况 - spring 无法解析您的${my.location}占位符,直到它配置了属性占位符。

这并不令人满意,但您可以使用更明确的语法来解决它:

<bean class="org.springframework.beans.factory.config.PropertyPlaceHolderConfigurer">
   <property name="location">
      <bean class="java.lang.System" factory-method="getenv">
         <constructor-arg value="my.location"/>
      </bean>
   </property>
</bean>
2021-10-27T02:38:36   回复