春 - コレクションの注入

春–コレクションの注入

1. 前書き

このチュートリアルでは、inject Java collections using the Spring frameworkを実行する方法を示します。

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

2. List@Autowired

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

public class CollectionsBean {

    @Autowired
    private List nameList;

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

ここでは、String値のListを保持するようにnameListプロパティを宣言しました。

In this example, we use field injection for nameList. Therefore, we put the @Autowired annotation

依存性注入またはそれを実装するさまざまな方法の詳細については、このguideを確認してください。

その後、構成セットアップクラスにCollectionsBean を登録します。

@Configuration
public class CollectionConfig {

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

    @Bean
    public List 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 nameSet;

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

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

This time we want to use a constructor injection for initializing the nameSet property。 これには、構成クラスの変更も必要です。

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

4. セッターインジェクションを使用したMap

同じロジックに従って、 nameMapフィールドを追加して、マップの挿入を示します。

public class CollectionsBean {

    private Map nameMap;

    @Autowired
    public void setNameMap(Map nameMap) {
        this.nameMap = nameMap;
    }

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

今回はwe have a setter method in order to use a setter dependency injectionです。 また、構成クラスにMap初期化コードを追加する必要があります。

@Bean
public Map nameMap(){
    Map  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 exampleBean {

    private String name;

    // constructor
}

そして、CollectionsBean classにプロパティとしてexampleBeanListを追加します。

public class CollectionsBean {

    @Autowired(required = false)
    private List beanList;

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

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

@Configuration
public class CollectionConfig {

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

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

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

    // other factory methods
}

Springコンテナは、exampleBeanタイプの個々のBeanを1つのコレクションに注入します。

これをテストするために、collectionsBean.printBeanList()メソッドを呼び出します。 出力には、Bean名がリスト要素として表示されます。

[John, Harry, Adam]

さて、let’s consider a scenario when there is not a exampleBean。 アプリケーションコンテキストにexampleBeanが登録されていない場合、必要な依存関係がないため、Springは例外をスローします。

@Autowired(required = false)を使用して、依存関係をオプションとしてマークできます。 例外をスローする代わりに、beanListは初期化されず、その値はnullのままになります。

null,の代わりに空のリストが必要な場合は、beanListを新しいArrayList:で初期化できます。

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

5.1. @Orderを使用したBeanのソート

We can specify the order of the beans while injecting into the collection

そのために、@Orderアノテーションを使用して、インデックスを指定します。

@Configuration
public class CollectionConfig {

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

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

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

Spring container first will inject the bean with the name “Harry”、最低次数の値があるため。

次に、“John”,を注入し、最後に“Adam”beanを注入します。

[Harry, John, Adam]

このguide@Orderの詳細をご覧ください。

5.2. @Qualifierを使用したBeanの選択

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

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

@Autowired
@Qualifier("CollectionsBean")
private List beanList;

次に、Listに注入するBeanを同じ@Qualifierでマークします。

@Configuration
public class CollectionConfig {

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

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

    @Bean
    public exampleBean getOneMoreElement() {
        return new exampleBean("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 nameListWithDefaultValue;

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

プロパティファイルを介して初期化されていない「names.list」キーでこれを実行した場合:

collectionsBean.printNameListWithDefaults();

出力として空のリストを取得します。

[ ]

7. 概要

このガイドでは、Springフレームワークを使用してさまざまなタイプのJavaコレクションを注入する方法を学びました。

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

いつものように、完全なコードはGitHub projectで入手できます。