12

假设我有大量值 aa bb cc dd ee ff gg 等,我需要在 spring 中作为构造函数传递

如果我需要配置为字符串数组,这在 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>

当值的数量增加时,它会占据很大的线条,看起来很难看。

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

4

5 回答 5

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> 

使用以下 .properties 文件

list.value=aa,bb,cc,dd   

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

<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> 
于 2012-07-20T11:33:55.080 回答
13

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>

事实上,即使字符串中只有 1 个值,并且没有逗号,它仍然可以工作。

不需要有人在另一个答案中提到的对 org.springframework.util.StringUtils 的调用。

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

于 2012-07-20T14:06:05.130 回答
5

您可以尝试更简单的方法并使用 Spring 表达式语言将值转换为列表:

<bean name="myBean" class="MyClass">
    <constructor-arg value="#{T(java.util.Arrays).asList('${list.values}')}"/>
</bean>
于 2015-05-22T12:41:45.483 回答
2

如果您使用的是最新的 Spring 框架版本(我相信是 Spring 3.1+),则不需要在 SpringEL 中进行字符串拆分,

只需在 Spring 的 Configuration 类中添加 PropertySourcesPlaceholderConfigurer 和 DefaultConversionService (带有注释的 Configuration ),例如,

@Configuration
public class AppConfiguration {

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }

    @Bean public ConversionService conversionService() {
        return new DefaultConversionService();
    }
}

在你的课堂上

@Value("${list}")
private List<String> list;

或者,如果您想要这样做,请在构造函数的参数上使用 @Value 注释。

最后在属性文件中

list=A,B,C,D,E

如果没有 DefaultConversionService,当您将值注入字段时,您只能将逗号分隔的字符串放入字符串数组中,但是 DefaultConversionService 为您做了一些方便的魔术,并将它们添加到 Collection、Array 等中(如果您愿意,请检查实现想了解更多)

With these two, it even handles all the redundant whitespaces including newline, so you don't need to add additional logics to trim them.

于 2018-11-16T04:14:31.113 回答
0

您可以实现一个以逗号分隔的字符串作为其参数的构造函数(并自己将该字符串拆分为值)。

如果您想要一个适用于任何构造函数/属性的解决方案,您可以考虑实现自己的PropertyEditor并配置 Spring 以使用它。

于 2012-07-20T11:15:47.170 回答