春 – コレクションの注入
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プロジェクト]にあります。