将动态属性列表读入 Spring 托管 bean
Posted
技术标签:
【中文标题】将动态属性列表读入 Spring 托管 bean【英文标题】:reading a dynamic property list into a spring managed bean 【发布时间】:2011-07-13 13:27:34 【问题描述】:我一直在搜索,但找不到这些步骤。我希望我遗漏了一些明显的东西。
我有一个包含以下内容的属性文件:
machines=A,B
我有另一个类似的文件,但机器元素中有不同数量的成员,如下所示:
machines=B,C,D
我的问题是如何以通用方式将这个可变长度的机器变量加载到我的 spring 配置中的 bean 中?
类似这样的:
<property name="machines" value="$machines"/>
在我的 java 代码中,machines 是一个数组或列表。如果我能弄清楚如何做到这一点,我可以随意定义它。
基本上,我宁愿让 spring 进行解析并将每个值粘贴到列表元素中,而不是我必须编写读取完整机器字符串的内容并自己进行解析(使用逗号分隔符)来放置每个值放入数组或列表中。有没有一种我想念的简单方法来做到这一点?
【问题讨论】:
"B,C,D".split(",")
做起来真的不难,是吗?
这并不难,但为了维护,如果需要更改配置属性,业务分析师可以更改比代码更好的配置属性。
【参考方案1】:
您可能想看看 Spring 的 StringUtils 类。它有许多有用的方法可以将逗号分隔的列表转换为 Set 或 String 数组。您可以使用这些实用方法中的任何一个,使用 Spring 的工厂方法框架,将解析后的值注入到您的 bean 中。这是一个例子:
<property name="machines">
<bean class="org.springframework.util.StringUtils" factory-method="commaDelimitedListToSet">
<constructor-arg type="java.lang.String" value="$machines"/>
</bean>
</property>
在本例中,'machines' 的值是从属性文件中加载的。
如果现有的实用程序方法不能满足您的需求,创建您自己的方法非常简单。这种技术允许您执行任何静态实用程序方法。
【讨论】:
非常感谢!这正是我想要的。 使用此方法不会修剪项目,请尝试:Spring EL 变得更容易。 爪哇:
List <String> machines;
上下文:
<property name="machines" value="#T(java.util.Arrays).asList('$machines')"/>
【讨论】:
非常有趣。不知道 Spring 允许这种事情。我不是 Spring 的粉丝,但我越使用它就越发现它的强大。 有没有办法通过注释来做到这一点?还有,我们如何提供默认值?【参考方案3】:如果您将属性“机器”设置为字符串数组,那么 spring 会自动为您执行此操作
machines=B,C,D
<property name="machines" value="$machines"/>
public void setMachines(String[] test)
【讨论】:
这绝对是我的首选和最简单的方法。谢谢@Simon 如果 setMachines() 被声明为获取字符串的集合,这很好用,但不适用于 spring 的内置 PropertyEditors。也就是说,它不适用于 setMachines(URL) 或 setMachines(File) (适用于单个值)。【参考方案4】:从 Spring 3.0 开始,也可以使用 @Value 注解读取值列表。
属性文件:
machines=B,C,D
Java 代码:
import org.springframework.beans.factory.annotation.Value;
@Value("#'$machines'.split(',')")
private List<String> machines;
【讨论】:
【参考方案5】:您可以直接将值注入列表而无需样板代码。(Spring 3.1+)
@Value("$machines")
private List<String> machines;
通过在您的配置中创建以下两个实例,为属性文件中的键“machines=B,C,D”。
@Bean
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer()
return new PropertySourcesPlaceholderConfigurer();
@Bean
public ConversionService conversionService()
return new DefaultConversionService();
这些也将涵盖所有基于单独的拆分和空白修剪。
【讨论】:
以上是关于将动态属性列表读入 Spring 托管 bean的主要内容,如果未能解决你的问题,请参考以下文章
Spring - 将属性文件中的日期列表注入bean属性[重复]
托管 Bean 的 JSF 2.0 ArrayList 属性