วิธีการกำหนด List bean ใน Spring


203

ฉันกำลังใช้สปริงเพื่อกำหนดลำดับขั้นในใบสมัครของฉัน มันถูกกำหนดค่าว่าคลาสที่จำเป็น (เรียกว่าที่นี่Configurator) ถูกฉีดด้วยสเตจ ตอนนี้ฉันต้องรายการของขั้นตอนในชั้นเรียนอีกชื่อ
ไม่ได้นำเสนอการเข้าถึงของเขารายการของขั้นตอนLoginBeanConfigurator

ฉันไม่สามารถเปลี่ยนชั้นเรียนConfiguratorได้

ความคิดของฉัน:
กำหนดถั่วใหม่ที่เรียกว่าขั้นตอนและฉีดมันและConfigurator LoginBeanปัญหาของฉันกับแนวคิดนี้คือฉันไม่รู้วิธีเปลี่ยนคุณสมบัตินี้:

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

เป็นถั่ว

สิ่งนี้ไม่ได้ผล:

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

ใครช่วยฉันได้ไหม

คำตอบ:


279

นำเข้าเนมสเปซ util ของ spring จากนั้นคุณสามารถกำหนด list 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 เป็นชนิด generics ที่จะใช้และเป็นทางเลือก list-classนอกจากนี้คุณยังสามารถระบุระดับการดำเนินรายการโดยใช้แอตทริบิวต์


10
และเห็นได้ชัดว่าเนื้อหาของรายการที่สามารถค่าอ้างอิงและถั่ว ฯลฯ ..
simonlord

คำตอบที่ยอดเยี่ยมมันเหมือน "ฤดูใบไม้ผลิ" มากขึ้น
jpaoletti

1
ง่าย ๆ :<property name="beanList" ref="myList"/>
Manuel Spigolon

1
สวัสดีฉันได้รับ cvc-complex-type.2.4.c นี้: wildcard ที่ตรงกันนั้นเข้มงวด แต่ไม่พบการประกาศสำหรับองค์ประกอบ 'ค่า' ฉันได้เพิ่มเนมสเปซและ schemaLocation ยัง
vishal

17
ฉันเพิ่งสังเกตเห็น@Autwiredว่าไม่ได้ช่วยเมื่อฉีดรายการสร้างด้วยวิธีนี้ อย่างไรก็ตามการ@Resourceทำงาน ie@Resource List<String> myList
Matt Friedman

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 - ฉันไม่ทราบว่าคุณสามารถทำได้ (แม้ว่าฉันจะเห็นว่ามันควรใช้งานได้) คำแนะนำ: ฉันคิดว่าคุณควรจะสามารถฝังStageClassประกาศถั่วในการ<list>หลีกเลี่ยงความต้องการ<ref>องค์ประกอบ
Stephen C

9
คุณสามารถใช้ util: list เพื่อให้ arraylist
Richard

เป็นไปได้หรือไม่ที่จะฝังนิยามถั่วเหล่านั้นไว้ใน "<list> </list>"
Sefler

@Sefler ใช่คำจำกัดความควรจะเหมือนกันมี
EIS

มีข้อผิดพลาด: หากใช้ @Autowired ตรวจสอบให้แน่ใจว่า pojo ของคุณเป็นประเภท "ArrayList" และไม่ใช่แค่ "รายชื่อ" หรือคุณอาจได้สิ่งที่แตกต่างไปจากเดิมอย่างสิ้นเชิง
Tilman Hausherr

38

ตัวเลือกอื่นคือการใช้ JavaConfig สมมติว่าทุกขั้นตอนได้รับการลงทะเบียนเป็นสปริงถั่วคุณเพียงต้อง

@Autowired
private List<Stage> stages;

และสปริงจะฉีดลงในรายการนี้โดยอัตโนมัติ หากคุณต้องการรักษาความสงบเรียบร้อย (วิธีแก้ปัญหาส่วนบนไม่ได้ทำเช่นนั้น) คุณสามารถทำได้ด้วยวิธีดังกล่าว:

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

  @Autowired
  private Stage2 stage2;

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

โซลูชันอื่นเพื่อรักษาลำดับใช้การเพิ่มความคิดเห็น@Orderในถั่ว จากนั้นรายการจะมีถั่วที่เรียงตามลำดับคำอธิบายประกอบ

@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: แต่ไม่สามารถทำงานได้เนื่องจากข้อผิดพลาดในการแปลง


4

org.springframework.beans.factory.config.ListFactoryBeanฉันคิดว่าคุณอาจจะมองหา

คุณประกาศอินสแตนซ์ ListFactoryBean โดยจัดเตรียมรายการให้เป็นอินสแตนซ์ของคุณสมบัติโดยมี<list>องค์ประกอบเป็นค่าและให้แอidททริบิวbean จากนั้นทุกครั้งที่คุณใช้การประกาศidเป็นrefหรือคล้ายกันในการประกาศ bean อื่น ๆ สำเนาใหม่ของรายการจะถูกยกตัวอย่าง นอกจากนี้คุณยังสามารถระบุListชั้นเรียนที่จะใช้


มันเป็นคำใบ้ที่ดี แต่ฉันไม่ได้ทำงาน anwer ของ stakker ทำงาน +1 สำหรับคำใบ้
guerda

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>  

กำหนดถั่วเหล่านั้น (test1, test2) หลังจากนั้น :)


1

ใช้ namespace util คุณจะสามารถลงทะเบียนรายการเป็น 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>แท็ก แบบนี้:

<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

และนี่คือวิธีการฉีดตั้งค่าในคุณสมบัติบางอย่างในฤดูใบไม้ผลิ

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

ลิงค์อ้างอิง

รายการ Inject ของ 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 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>

การอ้างอิงการเชื่อมโยง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.