春にリストBeanを定義する方法は?


203

Springを使用して、アプリケーションのステージを定義しています。必要なクラス(ここではと呼ばれますConfigurator)にステージが挿入されるように構成されています。
次に、という名前の別のクラスにステージのリストが必要LoginBeanです。Configuratorステージの彼のリストへのアクセスを提供していません。

クラスは変更できませんConfigurator

私のアイデア:
Stagesという新しいBeanを定義し、それをConfiguratorandに注入しLoginBeanます。このアイデアの私の問題は、このプロパティを変換する方法がわからないことです。

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

豆に。

このようなものは機能しません:

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

誰かがこれを手伝ってくれる?

回答:


279

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


10
そして、明らかにリストの内容は、可能な値、参照、豆など。
simonlord

すばらしい答え、それはより「春のような」
jpaoletti 2013

1
シンプル:<property name="beanList" ref="myList"/>
マヌエルスピゴロン

1
こんにちは私はこのcvc-complex-type.2.4.cを取得しています:一致するワイルドカードは厳密ですが、要素 'value'の宣言が見つかりません。ネームスペースとschemaLocationを追加しました
vishal

17
@Autwiredこの方法で作成されたリストを挿入するとき、それが役に立たないことに気づきました。ただし、@Resource動作します。ie@Resource List<String> myList
Matt Friedman

173

これが1つの方法です。

<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-あなたがそれができるとは知りませんでした(うまくいくはずですが)。提案:要素の必要性を回避するために、StageClassBean宣言を埋め込むことができるはずです。<list><ref>
Stephen C

9
util:listを使用して配列リストを取得することもできます
Richard

これらのBean定義を「<list> </ list>」に埋め込むことはできますか?
Sefler

@Seflerはい、定義はそこで同じでなければなりません
eis

落とし穴があります。@ Autowiredを使用する場合、pojoのタイプも「List」だけでなく「ArrayList」であることを確認してください。そうしないと、まったく異なるものを取得できます。
Tilman Hausherr、

38

別のオプションは、JavaConfigを使用することです。すべてのステージがすでにスプリングBeanとして登録されているとすると、次のことを行う必要があります。

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

順序を維持するためのもう1つの解決策は@Order、Beanにアノテーションを使用することです。次に、リストにはアノテーション値の昇順で並べられたBeanが含まれます。

@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

スタッカーは素晴らしい答えを出しました。私はそれをよりダイナミックにして、Spring 3 EL式を使用するために、さらに一歩進んでいきます。

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

私はutil:listを使用してこれを行う方法を理解しようとしましたが、変換エラーが原因で機能しませんでした。


4

お探しの方もいらっしゃると思いますorg.springframework.beans.factory.config.ListFactoryBean

ListFactoryBeanインスタンスを宣言し、<list>値として要素を持つプロパティとしてインスタンス化されるリストを提供し、Beanにid属性を与えます。次に、宣言さidれたをref類似のBean宣言で使用するたびに、リストの新しいコピーがインスタンス化されます。List使用するクラスを指定することもできます。


それは良いヒントですが、動作しません。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>  

その後、それらのBean(test1、test2)を定義します:)


1

util名前空間を使用すると、アプリケーションコンテキストでBeanとしてリストを登録できます。その後、リストを再利用して、他の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

そして、これはSpringのいくつかのプロパティにセットを注入する方法です:

<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

文字列のリストを挿入します。

以下のような文字列のリストを取得するCountriesモデルクラスがあるとします。

public class Countries {
    private List<String> countries;

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

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

}

次のxml定義は、beanを定義し、国のリストを挿入します。

<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定義。

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