使用PropertiesFactoryBean进行属性扩展

时间:2012-10-25 05:55:08

标签: java spring

我希望公开一个Properties Spring 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.url获得appProperties值,则会获得http://${server.host}/some/endpoint - 即该值未展开。但是,如果我从service.url获得serviceUrl的值,则该值已展开:http://myhost.com/some/endpoint

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

或者,如果有人能指出我将为我做扩展的Spring bean(必须是Spring 3.1),我也会接受这个! (有趣的是,如果您从EnvironmentPropertySource手动提取属性值,您会发现这些值也未展开。)

谢谢, 道穆埃尔。

1 个答案:

答案 0 :(得分:1)

我已经很晚了,但是我已经看了很多次,我认为这需要快速反应。你所看到的是一个关于Spring如何处理属性扩展的工件。找到属性扩展需求时,仅检查以前加载的源,而不检查当前加载的属性源。加载文件时,没有以前的源,因此$ {server.host}不会扩展。当您稍后通过@Value批注引用$ {server.url}时,将加载属性文件源,并且可以按预期进行搜索。这就是@Value注释获得完全扩展的原因,但是从属性文件中查询的结果却没有。