如何在Spring中定义List bean?


203

我正在使用Spring定义应用程序中的阶段。已配置为将必要的类(此处称为Configurator)与阶段一起注入。
现在,我需要另一个名为的类中的阶段列表LoginBean。在Configurator不提供访问其阶段的名单。

我不能改变班级Configurator

我的想法:
定义一个名为Stages的新bean,并将其注入到Configurator和中LoginBean。我的想法是,我不知道如何转换此属性:

<property ...>
  <list>
    <bean ... >...</bean>
    <bean ... >...</bean>
    <bean ... >...</bean>
  </list>
</property>

变成豆

这样的事情不起作用:

<bean id="stages" class="java.util.ArrayList">

有人可以帮我吗?

Answers:


279

导入spring util名称空间。然后,您可以如下定义一个列表bean:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                    http://www.springframework.org/schema/util
                    http://www.springframework.org/schema/util/spring-util-2.5.xsd">


<util:list id="myList" value-type="java.lang.String">
    <value>foo</value>
    <value>bar</value>
</util:list>

值类型是要使用的泛型类型,并且是可选的。您也可以使用属性指定列表实现类list-class


10
显然列表中的内容可以是数值,引用和豆类等。
simonlord

精彩的答案,更像是“春天般的”
jpaoletti

1
简单:<property name="beanList" ref="myList"/>
Manuel Spigolon 2014年

1
嗨,我得到了这个cvc-complex-type.2.4.c:匹配的通配符很严格,但是找不到元素'value'的声明。我仍然添加了命名空间和schemaLocation
2014年

17
我只是注意到@Autwired在注入以这种方式创建的列表时没有帮助。但是,@Resource有效。即@Resource List<String> myList
Matt Friedman 2014年

173

这是一种方法:

<bean id="stage1" class="Stageclass"/>
<bean id="stage2" class="Stageclass"/>

<bean id="stages" class="java.util.ArrayList">
    <constructor-arg>
        <list>
            <ref bean="stage1" />
            <ref bean="stage2" />                
        </list>
    </constructor-arg>
</bean>

1
+1-我不知道您可以这样做(尽管我可以看到它应该可以工作)。建议:我认为您应该能够将StageClassBean声明嵌入在其中,从而<list>避免使用<ref>元素。
斯蒂芬·C

9
您还可以使用util:list为您提供一个数组列表
Richard

是否可以将这些bean定义嵌入“ <list> </ list>”中?
塞夫勒2012年

@Sefler是的,那里的定义应该相同
eis

有一个陷阱:如果使用@Autowired,请确保您的pojo也是“ ArrayList”类型,而不仅仅是“ List”类型,否则您将得到完全不同的东西。
Tilman Hausherr

38

另一个选择是使用JavaConfig。假设所有阶段都已注册为spring bean,则只需:

@Autowired
private List<Stage> stages;

并且spring会自动将它们注入此列表。如果您需要保留订单(上部解决方案不这样做),则可以采用以下方式:

@Configuration
public class MyConfiguration {
  @Autowired
  private Stage1 stage1;

  @Autowired
  private Stage2 stage2;

  @Bean
  public List<Stage> stages() {
    return Lists.newArrayList(stage1, stage2);
  }
}

保留顺序的另一个解决方案是@Order在bean上使用注释。然后列表将包含按注释值升序排序的bean。

@Bean
@Order(1)
public Stage stage1() {
    return new Stage1();
}

@Bean
@Order(2)
public Stage stage2() {
    return new Stage2();
}

34
<bean id="someBean"
      class="com.somePackage.SomeClass">
    <property name="myList">
        <list value-type="com.somePackage.TypeForList">
            <ref bean="someBeanInTheList"/>
            <ref bean="someOtherBeanInTheList"/>
            <ref bean="someThirdBeanInTheList"/>
        </list>
    </property>
</bean>

在SomeClass中:

class SomeClass {

    List<TypeForList> myList;

    @Required
    public void setMyList(List<TypeForList> myList) {
        this.myList = myList;
    }

}

8

Stacker提出了一个很好的答案,我将走得更远,使其更具动态性,并使用Spring 3 EL Expression。

<bean id="listBean" class="java.util.ArrayList">
        <constructor-arg>
            <value>#{springDAOBean.getGenericListFoo()}</value>
        </constructor-arg>
</bean>

我试图弄清楚该如何使用util:list来实现,但由于转换错误而无法正常工作。


4

我想您可能正在寻找org.springframework.beans.factory.config.ListFactoryBean

您声明一个ListFactoryBean实例,为要实例化的列表提供一个属性<list>,并带有一个元素作为其值,并为Bean提供一个id属性。然后,每次在其他bean声明中使用声明id为a ref或类似名称时,都会实例化列表的新副本。您也可以指定List要使用的类。


这是一个很好的提示,但我无法正常工作。斯塔克的答案有效。+1为提示。
瓜达

2
 <bean id="student1" class="com.spring.assin2.Student">  
<property name="name" value="ram"></property>  
<property name="id" value="1"></property> 
<property name="listTest">
        <list value-type="java.util.List">
            <ref bean="test1"/>
            <ref bean="test2"/>
        </list>
    </property>
</bean>  

之后定义那些bean(test1,test2):)


1

使用util名称空间,您将能够在应用程序上下文中将列表注册为Bean。然后,您可以重用该列表以将其注入其他bean定义中。


1

除了Jakub的答案之外,如果您打算使用JavaConfig,还可以通过以下方式自动接线:

import com.google.common.collect.Lists;

import java.util.List;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Bean;

<...>

@Configuration
public class MyConfiguration {

    @Bean
    public List<Stage> stages(final Stage1 stage1, final Stage2 stage2) {
        return Lists.newArrayList(stage1, stage2);
    }
}

1

您只需id<list>标记内的bean中删除。像这样:

<property name="listStaff">
  <list>
    <bean class="com.test.entity.Staff">
        <constructor-arg name="name" value = "Jonh"/>
        <constructor-arg name="age" value = "30"/>
    </bean>
    <bean class="com.test.entity.Staff">
        <constructor-arg name="name" value = "Jam"/>
        <constructor-arg name="age" value = "21"/>
    </bean>
  </list>
</property>

0

这就是在Spring中注入一些属性的方法:

<bean id="process"
      class="biz.bsoft.processing">
    <property name="stages">
        <set value-type="biz.bsoft.AbstractStage">
            <ref bean="stageReady"/>
            <ref bean="stageSteady"/>
            <ref bean="stageGo"/>
        </set>
    </property>
</bean>

0

注入字符串列表。

假设您具有“国家”模型类,该类采用如下所示的字符串列表。

public class Countries {
    private List<String> countries;

    public List<String> getCountries() {
        return countries;
    }   

    public void setCountries(List<String> countries) {
        this.countries = countries;
    }

}

根据xml定义,定义一个bean并插入国家列表。

<bean id="demoCountryCapitals" name="demoCountryCapitals" class="com.sample.pojo.Countries">
   <property name="countries">
      <list>
         <value>Iceland</value>
         <value>India</value>
         <value>Sri Lanka</value>
         <value>Russia</value>
      </list>
   </property>
</bean>

参考链接

注入Pojos列表

假设您有如下所示的模型类。

public class Country {
    private String name;
    private String capital;
    .....
    .....
 }

public class Countries {
    private List<Country> favoriteCountries;

    public List<Country> getFavoriteCountries() {
        return favoriteCountries;
    }

    public void setFavoriteCountries(List<Country> favoriteCountries) {
        this.favoriteCountries = favoriteCountries;
    }

}

Bean定义。

 <bean id="india" class="com.sample.pojo.Country">
  <property name="name" value="India" />
  <property name="capital" value="New Delhi" />
 </bean>

 <bean id="russia" class="com.sample.pojo.Country">
  <property name="name" value="Russia" />
  <property name="capital" value="Moscow" />
 </bean>


 <bean id="demoCountryCapitals" name="demoCountryCapitals" class="com.sample.pojo.Countries">
  <property name="favoriteCountries">
   <list>
    <ref bean="india" />
    <ref bean="russia" />
   </list>
  </property>
 </bean>

参考链接

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.