【问题标题】:reading a dynamic property list into a spring managed bean将动态属性列表读入 Spring 托管 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(",")做起来真的不难,是吗?
  • 这并不难,但为了维护,如果需要更改配置属性,业务分析师可以更改比代码更好的配置属性。

标签: spring dynamic javabeans


【解决方案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();
    }
    

    这些也将涵盖所有基于单独的拆分和空白修剪。

    【讨论】:

      猜你喜欢
      • 2023-04-07
      • 1970-01-01
      • 2014-10-29
      • 1970-01-01
      • 1970-01-01
      • 2014-05-27
      • 2011-12-24
      相关资源
      最近更新 更多