स्प्रिंग में सूची बीन कैसे परिभाषित करें?


203

मैं अपने आवेदन में चरणों को परिभाषित करने के लिए स्प्रिंग का उपयोग कर रहा हूं। यह कॉन्फ़िगर किया गया है कि आवश्यक वर्ग (यहां कहा जाता है Configurator) को चरणों के साथ इंजेक्ट किया जाता है।
अब मुझे एक अन्य वर्ग में चरणों की सूची की आवश्यकता है, जिसका नाम है LoginBeanConfiguratorउसके चरणों की सूची के लिए उपयोग प्रदान नहीं करता है।

मैं क्लास नहीं बदल सकता Configurator

माई आइडिया:
स्टैज नामक एक नई बीन को परिभाषित करें और इसे इंजेक्ट करें Configuratorऔर LoginBean। इस विचार के साथ मेरी समस्या यह है कि मुझे नहीं पता कि इस संपत्ति को कैसे बदलना है:

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

एक बीन में।

कुछ इस तरह से काम नहीं करता है:

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

क्या कोई मेरी इसके साथ मदद कर सकता है?

जवाबों:


279

स्प्रिंग यूज़ नेमस्पेस आयात करें। फिर आप एक सूची बीन को इस प्रकार परिभाषित कर सकते हैं:

<?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
और स्पष्ट रूप से सूची की सामग्री मूल्य, संदर्भ और सेम आदि हो सकती है ..
सिमोनोर्ड

अद्भुत जवाब, यह अधिक "वसंत-जैसा" है
जेपीओएलेटी

1
सरल:<property name="beanList" ref="myList"/>
मैनुअल स्पिगोलन

1
नमस्ते, मुझे यह cvc-complex-type.2.4.c मिल रहा है: मैचिंग वाइल्डकार्ड सख्त है, लेकिन तत्व 'मूल्य' के लिए कोई घोषणा नहीं मिल सकती है। मैंने ave जोड़ा नेमस्पेस और स्कीमालेशन अभी भी
vishal

17
मैंने अभी देखा कि @Autwiredइस तरह बनाई गई सूची को इंजेक्ट करते समय मदद नहीं करता है। हालाँकि, @Resourceकाम करता है। यानी@Resource List<String> myList
मैट फ्रीडमैन

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>
स्टीफन सी

9
आप भी उपयोग कर सकते हैं: सूची आपको एक सरणी सूची देने के लिए
रिचर्ड

क्या उन सेम परिभाषाओं को "<सूची> </ सूची>" में एम्बेड करना संभव है?
सेफलर

@ सिफर हां, परिभाषाएं समान होनी चाहिए
eis

एक ख़राबी है: अगर @Autowired का उपयोग करते हैं, तो सुनिश्चित करें कि आपका पूजो भी "ArrayList" प्रकार का है और न केवल "सूची" या आप पूरी तरह से कुछ अलग कर सकते हैं।
तिलमन होउशर

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>

और कुछ क्लाकस में:

class SomeClass {

    List<TypeForList> myList;

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

}

8

स्टेकर ने एक महान जवाब दिया, मैं इसे और अधिक गतिशील बनाने और स्प्रिंग 3 ईएल एक्सप्रेशन का उपयोग करने के लिए एक कदम आगे जाऊंगा।

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

मैं यह पता लगाने की कोशिश कर रहा था कि मैं उपयोग के साथ यह कैसे कर सकता हूं: सूची लेकिन रूपांतरण त्रुटियों के कारण यह काम नहीं कर सका।


4

मुझे लगता है कि आप ढूंढ रहे होंगे org.springframework.beans.factory.config.ListFactoryBean

आप एक ListFactoryBean उदाहरण की घोषणा करते हैं, सूची प्रदान करते हुए एक संपत्ति के रूप में तत्कालिक होने के लिए एक <list>तत्व इसके मूल्य के रूप में, और सेम को एक idविशेषता दें। फिर, हर बार जब आप किसी अन्य बीन की घोषणा में idएक 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>  

उन सेम (टेस्ट 1, टेस्ट 2) को बाद में परिभाषित करें :)


1

उपयोग नाम स्थान का उपयोग करें, आप अपने आवेदन के संदर्भ में बीन के रूप में सूची को पंजीकृत करने में सक्षम होंगे। फिर आप अन्य बीन परिभाषाओं में इसे इंजेक्ट करने के लिए सूची का पुन: उपयोग कर सकते हैं।


1

जैकुब के उत्तर के अतिरिक्त, यदि आप 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>

संदर्भ लिंक

पूजो की इंजेक्ट सूची

मान लीजिए अगर आपके पास नीचे की तरह मॉडल वर्ग है।

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>

संदर्भ लिंक

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.