1. 序章

このチュートリアルでは、Springフレームワークを使用してコレクションをJavaインジェクトする方法を示します。

簡単に言えば、 List、Map、Setコレクションインターフェイスを使用した例を示します。

2. リストウィズ@Autowired

Beanの例を作成しましょう。

public class CollectionsBean {

    @Autowired
    private List<String> nameList;

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

ここでは、 nameList プロパティを宣言して、String値のListを保持します。

この例では、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クラスを変更してみましょう。

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. マップセッターインジェクション付き

同じロジックに従って、 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);
    }
}

今回はセッター依存性注入を使用するためのセッターメソッドがあります。 また、構成クラスに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
}

そして、BaeldungBeanListをプロパティとしてCollectionsBeanクラスに追加します。

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をソートする

コレクションに挿入するときに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の詳細をご覧ください。

5.2. @Qualifierを使用してBeanを選択する

@Qualifier を使用して、@Qualifier名に一致する特定のコレクションに注入するBeanを選択できます。

注入ポイントに使用する方法は次のとおりです。

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

次に、リストに挿入する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()静的メソッドを使用して、挿入された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コレクションを挿入する方法を学びました。

また、参照タイプを使用したインジェクションと、コレクション内でそれらを選択または注文する方法についても検討しました。

いつものように、完全なコードはGitHubプロジェクトで入手できます。