在Spring中指定包含值的列表的最简单方法是什么?

Kat*_*hir 12 java spring

假设我有一个很大的值列表aa bb cc dd ee ff gg等,我需要在春天作为构造函数传递

如果我需要配置为字符串数组,那么在spring中很容易,因为我们可以将值指定为逗号分隔为aa,bb,cc等,

如果我需要配置为列表,我需要像下面这样做

<bean name="myBean" class="MyClass">
    <constructor-arg>
        <list>
            <value>aa</value>
            <value>bb</value>
            <value>cc</value>
            <value>dd</value>
        </list>
    </constructor-arg>
</bean>
Run Code Online (Sandbox Code Playgroud)

当数值增加时,它占据了巨大的线条,看起来很丑陋.

有人可以帮助我如何将大值作为字符串中的列表作为构造函数传递?

Axx*_*ris 22

传递给列表的值是否来自属性文件?如果是这样,您可以使用以下内容:

<bean name="myBean" class="MyClass">
   <constructor-arg>
      <bean class="org.springframework.util.StringUtils" factory-method="commaDelimitedListToSet">
          <constructor-arg type="java.lang.String" value="${list.value}"/>
      </bean>
    </constructor-arg>
</bean> 
Run Code Online (Sandbox Code Playgroud)

使用以下.properties文件

list.value=aa,bb,cc,dd   
Run Code Online (Sandbox Code Playgroud)

如果没有,你显然可以直接通过:

<bean name="myBean" class="MyClass">
   <constructor-arg>
      <bean class="org.springframework.util.StringUtils" factory-method="commaDelimitedListToSet">
          <constructor-arg type="java.lang.String" value="aa,bb,cc,dd"/>
      </bean>
    </constructor-arg>
</bean> 
Run Code Online (Sandbox Code Playgroud)

  • 注意:工厂方法返回一个集合,它将以任意顺序转换为列表*! (2认同)

Mat*_*att 12

Spring可以自动将任何逗号分隔的字符串转换为列表或数组:

public class Foo {
   public void setValueList(String[] values) { ... }
}

<bean class="Foo"
      p:valueList="a,b,c,d" />
<bean class="Foo"
      c:_0="a,b,c,d" />
<bean class="Foo">
     <constructor-arg><value>a,b,c,d</value></constructor-arg>
</bean>
Run Code Online (Sandbox Code Playgroud)

实际上,即使字符串中只有1个值,也没有逗号,它仍然有效.

没有必要调用org.springframework.util.StringUtils,有人在另一个答案中提到.

构造函数args的这个词也是(c:_0是使用c命名空间的<constructor-arg index ="0">的简写.


Jac*_*ski 5

你可以尝试更简单的东西,并使用Spring表达式语言将值转换为列表:

<bean name="myBean" class="MyClass">
    <constructor-arg value="#{T(java.util.Arrays).asList('${list.values}')}"/>
</bean>
Run Code Online (Sandbox Code Playgroud)