【问题标题】:Defining a list in a Spring application context file在 Spring 应用程序上下文文件中定义列表
【发布时间】:2011-11-30 22:27:10
【问题描述】:

你可以在 Spring application-context.xml 文件中创建一个列表而不使用<list> 元素吗?

我有一个 bean,其构造函数采用 Collection 对象,我想通过“value”属性传递整个列表。原因是该值来自 .properties 文件,您无法在 .properties 文件中定义列表。

我想做这样的事情……可以吗?

MyClass.java:

public class MyClass{
  public MyClass(Collection<String> collection){ /* ... */ }
}

应用程序上下文.xml:

<bean name="myBean" class="com.company.MyClass">
  <constructor-arg value="${the.value}" />
</bean>

.properties 文件:

the.value=item1,item2,item3

谢谢。

【问题讨论】:

    标签: java spring


    【解决方案1】:
    <bean name="myBean" class="com.company.MyClass">
      <constructor-arg>
        <bean class="org.springframework.util.StringUtils" factory-method="commaDelimitedListToSet">
            <constructor-arg type="java.lang.String" value="${the.value}"/>
        </bean>
      </constructor-arg>
    </bean>
    

    【讨论】:

    • 啊,很好。 (除了“Ew!”因素;egads。)
    • 你不能在逗号周围有空格,否则空格将成为项目的一部分。我可以使用delimitedListToStringArray 并将分隔符定义为“,”,但这会产生所需的空间,这不是我想要的。但这没什么大不了的。我更新了我的问题以删除逗号之间的空格。
    【解决方案2】:

    您的问题的一个可能解决方案是将单个字符串传递给您的构造函数,然后使用 String.split() 解析构造函数内的列表。

    【讨论】:

    • 是的,我想过,但如果我不需要,我不想创建一个单独的构造函数。
    • 不幸的是,我相信你必须这样做。解析字符串后,您始终可以将构造函数逻辑委托给实际的构造函数。
    【解决方案3】:

    我不相信,但你可以有一个从字符串构建列表的构造函数。

    (实际上,我并不完全确定我是否正确——您可能可以使用自定义占位符配置器玩重要的游戏,尽管您是否应该可能值得商榷:)

    【讨论】:

    • 我可以创建一个单独的构造函数,它接受一个字符串并将其解析为一个列表,但如果我不需要,我不想这样做。
    • 另一个不采用背信弃义的选择是创建一个单独的 bean,并使用该 bean(最终是一个列表)作为构造函数参数。但是,当您在属性文件中保留非属性类的东西时,IMO,事情会变得很烦人。 Although this may help :)
    • 我宁愿创建一个新的构造函数也不愿定义更多的bean。
    【解决方案4】:

    这行得通。 您可以使用 SPEL。

    在 bean 配置中,

    <property name="collection" value="#{{'item1','item2','item3'}}"/>
    

    【讨论】:

      猜你喜欢
      • 2010-10-09
      • 1970-01-01
      • 2011-06-07
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-28
      • 1970-01-01
      • 2021-10-11
      相关资源
      最近更新 更多