如何在Spring中定义List bean?

时间:2010-03-10 10:21:51

标签: java spring

我正在使用Spring在我的应用程序中定义阶段。它被配置为必要的类(这里称为Configurator)注入阶段 现在我需要另一个名为LoginBean的班级的阶段列表。 Configurator无法访问他的阶段列表。

我无法更改班级Configurator

我的想法:
定义一个名为Stages的新bean,并将其注入ConfiguratorLoginBean。 我对这个想法的问题是我不知道如何转换这个属性:

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

进入一个bean。

这样的事情不起作用:

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

有人可以帮我吗?

13 个答案:

答案 0 :(得分:269)

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

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

答案 1 :(得分:166)

这是一种方法:

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

答案 2 :(得分:34)

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

@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);
  }
}

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

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

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

答案 3 :(得分:30)

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

    private List<TypeForList> myList;

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

}

答案 4 :(得分:8)

Stacker提出了一个很好的答案,我会更进一步,使其更具动态性并使用Spring 3 EL Expression。

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

我试图找出如何使用util:list进行此操作但由于转换错误而无法使其工作。

答案 5 :(得分:4)

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

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

答案 6 :(得分:1)

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

答案 7 :(得分: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);
    }
}

答案 8 :(得分:1)

 class AppHelper {
        public static int getAge() {
            return 30;
        }
    }

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

答案 9 :(得分:1)

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

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

答案 10 :(得分:1)

插入字符串列表。

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

x86_64-w64-mingw32

按照xml定义定义一个bean,并插入国家/地区列表。

public class Countries {
    private List<String> countries;

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

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

}

参考link

注入Pojos列表

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

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

Bean定义。

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

}

参考Link

答案 11 :(得分:0)

这就是如何在Spring中的一些属性中注入set:

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

答案 12 :(得分:0)

在 util:list 中使用 list-class 属性来制作任何特定类型的独立列表。例如,如果您想制作 ArrayList 类型的列表:

<util:list id="namesList" list-class="java.util.ArrayList" value-type="java.lang.String">
  <value>Abhay</value>
  <value>ankit</value>
  <value>Akshansh</value>
  <value>Db</value>
</util:list>

或者如果你想制作一个 LinkedList 类型的列表,那么:

<util:list id="namesList" list-class="java.util.LinkedList" value-type="java.lang.String">
  <value>Abhay</value>
  <value>ankit</value>
  <value>Akshansh</value>
  <value>Db</value>
</util:list>