将动态属性列表读入 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' 的值是从属性文件中加载的。

如果现有的实用程序方法不能满足您的需求,创建您自己的方法非常简单。这种技术允许您执行任何静态实用程序方法。

【讨论】:

非常感谢!这正是我想要的。 使用此方法不会修剪项目,请尝试: 【参考方案2】:

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属性[重复]

spring能动态给一个类增加一个方法或属性吗

如何使用存储在数据库表中的属性配置 Spring bean

托管 Bean 的 JSF 2.0 ArrayList 属性

反射-Spring管理Bean,注入Bean属性的反射机制。

Spring JSF 集成:如何在 JSF 托管 bean 中注入 Spring 组件/服务?