代码之家  ›  专栏  ›  技术社区  ›  Paul McKenzie

来自其他属性的属性占位符位置

  •  12
  • Paul McKenzie  · 技术社区  · 16 年前

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

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

    这样地

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

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

    保罗

    2 回复  |  直到 16 年前
        1
  •  5
  •   skaffman    16 年前

    这里的问题是,您试图使用属性占位符语法配置一个属性占位符:)这有点鸡和蛋的情况-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>
    
        2
  •  15
  •   Pablojim    16 年前

    你可以用一种稍微不同的方法来实现这一点。下面是我们如何配置它。我加载默认属性,然后用可配置位置的属性覆盖它们。这对我很管用。

    <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>