কিভাবে বসন্তে একটি তালিকা শিম সংজ্ঞা?


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>

মান-প্রকার হ'ল জেনেরিক প্রকারটি ব্যবহার করা হবে এবং এটি optionচ্ছিক। বৈশিষ্ট্যটি ব্যবহার করে আপনি তালিকাটি বাস্তবায়ন ক্লাসও নির্দিষ্ট করতে পারেন list-class


10
এবং স্পষ্টতই তালিকার বিষয়বস্তুগুলি মান, উল্লেখ এবং মটরশুটি ইত্যাদি হতে পারে
সিমোনলর্ড

আশ্চর্যজনক উত্তর, এটি আরও "বসন্তের মতো"
jpaoletti

1
সরল:<property name="beanList" ref="myList"/>
ম্যানুয়েল স্পিগলন

1
হাই, আমি এই সিভিসি-কমপ্লেক্স-টাইপ ২.৪.২.২ পেয়েছি: মেলানো ওয়াইল্ডকার্ড কঠোর, তবে 'মান' উপাদানটির জন্য কোনও ঘোষণা খুঁজে পাওয়া যায় না। আমি জ Ave যোগ নামস্থান এবং schemaLocation এখনো
বিশাল

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
আপনি ব্যবহার করতে পারেন: তালিকাতে আপনাকে একটি অ্যারেলিস্ট দিতে
রিচার্ড

এই শিম সংজ্ঞাগুলি "<list> </list>" এ এম্বেড করা কি সম্ভব?
সেফলার

@Sefler হ্যাঁ, সংজ্ঞা সেখানে অভিন্ন হবে
Eis

একটি সমস্যা রয়েছে: যদি @ অটোভায়ার্ড ব্যবহার করা হয় তবে নিশ্চিত হয়ে নিন যে আপনার পোজোও "অ্যারেলিস্ট" টাইপের এবং কেবল "তালিকা" নয় বা আপনি সম্পূর্ণ আলাদা কিছু পেতে পারেন make
টিলম্যান হাশার

38

আরেকটি বিকল্প হ'ল জাভা কনফিগ ব্যবহার করা। ধরে নিই যে সমস্ত পর্যায়ে ইতিমধ্যে আপনার বসন্ত মটরশুটি হিসাবে নিবন্ধিত রয়েছে:

@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

আপনি একটি তালিকার কারখানার বিয়ান উদাহরণ ঘোষণা করুন, সম্পত্তি হিসাবে তাত্ক্ষণিকভাবে তালিকা সরবরাহের জন্য কোনও <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

জাকুবের উত্তরের সংযোজন হিসাবে, আপনি যদি জাভা কনফিগ ব্যবহার করার পরিকল্পনা করেন তবে আপনি সেভাবে স্বায়ত্তশাসনও করতে পারেন:

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

}

নিম্নলিখিত এক্সএমএল সংজ্ঞাটি শিমের সংজ্ঞা দেয় এবং দেশগুলির তালিকা ইনজেকশন করে।

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