3

我希望公开一个PropertiesSpring bean,其值已通过典型的属性扩展机制进行扩展。我正在使用 Spring 3.1。让我离题。

给定以下属性文件:

server.host=myhost.com
service.url=http://${server.host}/some/endpoint

而这部分 Spring XML 配置文件:

<bean id="appProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
  <property name="locations">
    <list>
      <value>classpath:default.properties</value>
    </list>
  </property>
</bean>

<context:property-placeholder properties-ref="appProperties" />

我可以编写以下工作代码:

@Component
public class MyComponent {

  @Autowired
  @Qualifier("appProperties")
  private Properties appProperties;

  @Value("${service.url}")
  private String serviceUrl;

  // remainder omitted

}

唯一的问题是,如果我service.urlappProperties我得到的值http://${server.host}/some/endpoint- 即该值是未扩展的。但是,如果我得到service.urlfromserviceUrl的值,则该值已扩展:http://myhost.com/some/endpoint

有谁知道将Properties实例公开为值已扩展的 Spring bean 的好方法?

或者,如果有人可以将我指向一个将为我进行扩展的 Spring bean(必须是 Spring 3.1),我也会接受这个!Environment(有趣的是,如果您手动从or中提取属性值,PropertySource您会发现这些也未展开。)

谢谢,穆尔。

4

1 回答 1

1

我对此已经很晚了,但它已经被浏览了足够多的时间,我认为它需要快速响应。您所看到的是 Spring 如何处理属性扩展的工件。当发现需要进行属性扩展时,只检查之前加载的源,而不检查当前加载的属性源。当文件加载时,没有以前的源,所以 ${server.host} 不会展开。当您稍后通过 @Value 注释引用 ${server.url} 时,会加载属性文件源并可以按预期进行搜索。这就是为什么 @Value 注释得到完全扩展但从属性文件查询的结果没有。

于 2014-07-03T14:26:09.377 回答