使用 Spring 从属性文件加载嵌套占位符

Posted

技术标签:

【中文标题】使用 Spring 从属性文件加载嵌套占位符【英文标题】:Loading Nested Placeholders from Properties File with Spring 【发布时间】:2012-12-19 02:18:24 【问题描述】:

是否可以从属性文件中加载嵌套占位符?我正在尝试动态加载 URL。

例如,如果我的属性文件包含

my.url=http://localhost:8888/service/nestedProperty/

有没有办法在运行时加载 nestedProperty 的值?类似于 ResourceBundle 的行为。如果是这样,我将如何有效地实例化字符串?目前我在想

<bean id="myURLString" class="java.lang.String" scope="prototype" lazy-init="true">
    <property name="URL" value="$my.url" />
</bean>

...但我不确定要嵌套哪些属性。如果可能的话,我想使用 Annotations 获得一个 bean,尽管我目前有一些类似于

ctx.getBean("myURLString", String.class, new Object[]  nestedProperty );

我在这里查看了 PropertyPlaceholderConfigurer 和其他几个属性文件问题,但我似乎无法弄清楚这是否可能。

我还应该注意,我想从我的代码中动态加载这个嵌套属性,或者至少从那里操作它们(可能通过@PostConstruct?)

【问题讨论】:

【参考方案1】:

是的,有可能:

my.url=http://localhost:8888/service/$nestedProperty
nestedProperty=foo/bar/baz

在示例中的大括号前添加美元符号即可!

要实际使用完全解析的属性,请执行以下操作:

@Value("$my.url")
private String url;

在 Spring bean 中。

【讨论】:

我不需要在我的 bean 定义中明确定义这个属性吗? 'nestedProperty' 指的是该名称的属性 - 示例的第二行 - 不是 bean。 Spring 加载所有配置文件中的所有属性并相互解析它们。只要避免循环引用就可以了。 这是否允许我从 ctx.getBean() 调用中动态指定嵌套属性,而不是使用“nestedProperty”的属性文件值? 查看我的更新;您实际上不必将属性视为 bean,您可以直接使用 @Value 注入它

以上是关于使用 Spring 从属性文件加载嵌套占位符的主要内容,如果未能解决你的问题,请参考以下文章

Spring_属性占位符

Spring占位符不解析JavaConfig中的属性

使用 Spring 属性占位符从文件 .properties 中读取列表

8 -- 深入使用Spring -- 1...4 属性占位符配置器

如何在 Spring 中以编程方式解析属性占位符

Spring Boot 配置属性的未解决占位符验证