簡體   English   中英

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

[英]What is the easiest way to specify a list with values in 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>

當數值增加時,它占據了巨大的線條,看起來很丑陋。

有人可以幫助我如何將大值作為字符串中的列表作為構造函數傳遞?

傳遞給列表的值是否來自屬性文件? 如果是這樣,您可以使用以下內容:

<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   

如果沒有,你顯然可以直接通過:

<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> 

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,有人在另一個答案中提到。

構造函數args的這個詞也是(c:_0是使用c命名空間的<constructor-arg index =“0”>的簡寫。

你可以嘗試更簡單的東西,並使用Spring表達式語言將值轉換為列表:

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

如果您使用的是最新的Spring框架版本(我認為是Spring 3.1+),那么您不需要在SpringEL中使用那些字符串拆分的東西,

只需在Spring的Configuration類(帶有注釋的配置類)中添加PropertySourcesPlaceholderConfigurer和DefaultConversionService,例如,

@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,只能在將值注入字段時將逗號分隔的String轉換為String數組,但DefaultConversionService會為您做一些方便的魔術,並將這些添加到Collection,Array等中。(如果你是的話,請檢查實現)想了解更多信息)

有了這兩個,它甚至可以處理所有冗余空格,包括換行符,因此您無需添加額外的邏輯來修剪它們。

您可以實現一個構造函數,該構造函數將逗號分隔的String作為其參數(並將該字符串自己拆分為值)。

如果你想要一個適用於任何構造函數/屬性的解決方案,你可以看看實現自己的PropertyEditor並配置Spring來使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM