java - 使用 PropertiesFactoryBean 进行属性扩展

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

}

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

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

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

谢谢, 穆尔。

最佳答案

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

关于java - 使用 PropertiesFactoryBean 进行属性扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13062421/

相关文章:

java - Neo4j 需要很长时间来创建节点之间的关系

java - 模拟 - 缺少方法调用异常

java - 在单例中使用 "private static final String"变量的最佳实践

java - 如何将 Spring URL 映射到/WEB-INF/views 中的 JSP 文件?

Java/MySQL - 如何从另一个类访问连接?

java - JTextField 字符串不起作用

Java HashMap 与数组列表

java - 如何在 Spring Boot 中将 hibernate.id.db_struct_naming_strategy 设置为旧版?

spring - 前端和后端带有 Dart 的Spring Web Flow

spring - Spring JDBC 是否提供任何针对 SQL 注入(inject)攻击的保护?