如何在Spring中定义List bean?

gue*_*rda 196 java spring

我正在使用Spring在我的应用程序中定义阶段.它被配置为必要的类(这里称为Configurator)注入阶段.
现在我需要另一个名为的阶段列表LoginBean.在Configurator不提供访问其阶段的名单.

我不能改变班级Configurator.

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

<property ...>
  <list>
    <bean ... >...</bean>
    <bean ... >...</bean>
    <bean ... >...</bean>
  </list>
</property>
Run Code Online (Sandbox Code Playgroud)

成豆.

这样的东西不起作用:

<bean id="stages" class="java.util.ArrayList">
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我吗?

sim*_*ord 274

导入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>
Run Code Online (Sandbox Code Playgroud)

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

  • 我注意到`@Awwired`在注入以这种方式创建的列表时没有帮助.但是,`@ Resource`有效.即`@Resource List <String> myList` (15认同)
  • 显然,列表的内容可以是值,引用和bean等. (10认同)
  • 您好,我收到此 cvc-complex-type.2.4.c:匹配通配符是严格的,但找不到元素“值”的声明。我仍然添加了命名空间和 schemaLocation (2认同)

sta*_*ker 168

这是一种方法:

<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>
Run Code Online (Sandbox Code Playgroud)

  • 你也可以使用util:list给你一个arraylist (9认同)

Jak*_*ski 34

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

@Autowired
private List<Stage> stages;
Run Code Online (Sandbox Code Playgroud)

和spring会自动将它们注入此列表中.如果您需要保留订单(上层解决方案不这样做),您可以这样做:

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

  @Autowired
  private Stage2 stage2;

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

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

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

@Bean
@Order(2)
public Stage stage2() {
    return new Stage2();
}
Run Code Online (Sandbox Code Playgroud)


Kor*_*gay 31

<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>
Run Code Online (Sandbox Code Playgroud)

在SomeClass中:

class SomeClass {

    private List<TypeForList> myList;

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

}
Run Code Online (Sandbox Code Playgroud)


haj*_*aju 8

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

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

我试图找出如何使用util:list来实现这一点,但由于转换错误而无法使其工作.