1前書き

このチュートリアルでは、Springフレームワークを使って

Java

コレクションをインジェクトする方法を説明します。

簡単に言うと、

List、Map、Set

の各コレクションインターフェイスを使用して例を示します。


2

List

と@ @ Autowired__

サンプルBeanを作成しましょう。

public class CollectionsBean {

    @Autowired
    private List<String> nameList;

    public void printNameList() {
        System.out.println(nameList);
    }
}

ここで、

String

値の

List

を保持するために

nameList

プロパティを宣言しました。

  • この例では、

    nameList

    にフィールドインジェクションを使用しています。したがって、

    @ Autowired

    アノテーション** を付けます。

依存性注入またはそれを実装するためのさまざまな方法についてもっと学ぶためには、このリンクをチェックしてください。

その後、

__CollectionsBean

__を構成設定クラスに登録します。

@Configuration
public class CollectionConfig {

    @Bean
    public CollectionsBean getCollectionsBean() {
        return new CollectionsBean();
    }

    @Bean
    public List<String> nameList() {
        return Arrays.asList("John", "Adam", "Harry");
    }
}


CollectionsBean

を登録するだけでなく、明示的に初期化して別の

@ Bean

設定として返すことで新しいリストを挿入します。

これで結果をテストできます。

ApplicationContext context = new AnnotationConfigApplicationContext(CollectionConfig.class);
CollectionsBean collectionsBean = context.getBean(
  CollectionsBean.class);
collectionsBean.printNameList();

printNameList()メソッドの出力:

----[John, Adam, Harry]----


3コンストラクタインジェクションを伴う

Set



Set

コレクションを使用して同じ例を設定するには、

__ CollectionsBean

__classを変更しましょう。

public class CollectionsBean {

    private Set<String> nameSet;

    public CollectionsBean(Set<String> strings) {
        this.nameSet = strings;
    }

    public void printNameSet() {
        System.out.println(nameSet);
    }
}

  • 今回は

    nameSet

    プロパティを初期化するためにコンストラクタインジェクションを使いたい** 。これには構成クラスの変更も必要です。

@Bean
public CollectionsBean getCollectionsBean() {
    return new CollectionsBean(new HashSet<>(Arrays.asList("John", "Adam", "Harry")));
}


4セッター注入を伴う

Map


同じロジックに従って、マップインジェクションを示すために

nameMap

__フィールドを追加しましょう。

public class CollectionsBean {

    private Map<Integer, String> nameMap;

    @Autowired
    public void setNameMap(Map<Integer, String> nameMap) {
        this.nameMap = nameMap;
    }

    public void printNameMap() {
        System.out.println(nameMap);
    }
}

今回は

setter依存性注入を使用するための

setterメソッドがあります。また、設定クラスに

Map

初期化コードを追加する必要があります。

@Bean
public Map<Integer, String> nameMap(){
    Map<Integer, String>  nameMap = new HashMap<>();
    nameMap.put(1, "John");
    nameMap.put(2, "Adam");
    nameMap.put(3, "Harry");
    return nameMap;
}


printNameMap()

メソッドを呼び出した後の結果:

{1=John, 2=Adam, 3=Harry}


5 Bean参照の注入

コレクションの要素としてBean参照を挿入する例を見てみましょう。

まず、Beanを作成しましょう。

public class BaeldungBean {

    private String name;

   //constructor
}

そして、

List

of

BaeldungBean

をプロパティとして

__CollectionsBean

__classに追加します。

public class CollectionsBean {

    @Autowired(required = false)
    private List<BaeldungBean> beanList;

    public void printBeanList() {
        System.out.println(beanList);
    }
}

次に、各

BaeldungBean

要素にJava構成ファクトリーメソッドを追加します。

@Configuration
public class CollectionConfig {

    @Bean
    public BaeldungBean getElement() {
        return new BaeldungBean("John");
    }

    @Bean
    public BaeldungBean getAnotherElement() {
        return new BaeldungBean("Adam");
    }

    @Bean
    public BaeldungBean getOneMoreElement() {
        return new BaeldungBean("Harry");
    }

   //other factory methods
}

Springコンテナは、

BaeldungBean

型の個々のBeanを1つのコレクションに注入します。

これをテストするために、

collectionsBean.printBeanList()

メソッドを呼び出します。出力はBean名をリスト要素として表示します。

----[John, Harry, Adam]----

それでは、

BaeldungBean

** がない場合のシナリオを考えましょう。アプリケーションコンテキストに

BaeldungBean

が登録されていない場合、必要な依存関係がないため、Springは例外をスローします。

依存関係をオプションとしてマークするには、

@ Autowired(required = false)

を使用できます。例外をスローする代わりに、

beanList

は初期化されず、その値は

null

のままになります。


nullではなく空のリストが必要な場合は、

beanList

を新しい

ArrayListで初期化できます。

@Autowired(required = false)
private List<BaeldungBean> beanList = new ArrayList<>();


5.1.

@ Order

を使用して豆をソートする

  • コレクションにインジェクトしながら、Beanの順序を指定できます** 。

そのために、

@ Order

アノテーションを使用してインデックスを指定します。

@Configuration
public class CollectionConfig {

    @Bean
    @Order(2)
    public BaeldungBean getElement() {
        return new BaeldungBean("John");
    }

    @Bean
    @Order(3)
    public BaeldungBean getAnotherElement() {
        return new BaeldungBean("Adam");
    }

    @Bean
    @Order(1)
    public BaeldungBean getOneMoreElement() {
        return new BaeldungBean("Harry");
    }
}

  • Springコンテナーは最初に最下位の値を持つので、

    “Harry”

    ** という名前のBeanをインジェクトします。

それから

“ John”、

そして最後に

“ Adam”

Beanをインジェクトします。

----[Harry, John, Adam]----

このリンクの

@ Order

についての詳細を学んでください:/spring-order[ガイド]。


5.2.

@修飾子

を使用したBeanの選択


@ Qualifier

を使用して、

@ Qualifier

名に一致する特定のコレクションにインジェクトするBeanを選択できます。

これが射出ポイントに使用される方法です。

@Autowired
@Qualifier("CollectionsBean")
private List<BaeldungBean> beanList;

それから

List

にインジェクトしたいBeanを同じ

@ Qualifier

でマークします。

@Configuration
public class CollectionConfig {

    @Bean
    @Qualifier("CollectionsBean")
    public BaeldungBean getElement() {
        return new BaeldungBean("John");
    }

    @Bean
    public BaeldungBean getAnotherElement() {
        return new BaeldungBean("Adam");
    }

    @Bean
    public BaeldungBean getOneMoreElement() {
        return new BaeldungBean("Harry");
    }

   //other factory methods
}

この例では、

__“ John”


という名前のBeanを、

“ CollectionsBean”

という名前の

List__に挿入するように指定します。ここでテストした結果

ApplicationContext context = new AnnotationConfigApplicationContext(CollectionConfig.class);
CollectionsBean collectionsBean = context.getBean(CollectionsBean.class);
collectionsBean.printBeanList();

出力から、コレクションには1つの要素しかないことがわかります。

----[John]----


6. 空のリストをデフォルト値として設定する


Collections.emptyList()

staticメソッドを使用して、注入されたListプロパティのデフォルト値を空のリストとして設定できます。

public class CollectionsBean {

    @Value("${names.list:}#{T(java.util.Collections).emptyList()}")
    private List<String> nameListWithDefaultValue;

    public void printNameListWithDefaults() {
        System.out.println(nameListWithDefaultValue);
    }
}

プロパティファイルで初期化されていない“ names.list”キーでこれを実行すると、

collectionsBean.printNameListWithDefaults();

出力として空のリストが表示されます。

----[]----


7. 概要

このガイドでは、Springフレームワークを使ってさまざまな種類のJavaコレクションをインジェクトする方法を学びました。

また、参照型を使用してインジェクションを調べ、コレクション内でそれらを選択または並べ替える方法を調べました。

いつものように、完全なコードはhttps://github.com/eugenp/tutorials/tree/master/spring-core[Githubプロジェクト]にあります。