目次へ

2.4. Constructor Injection

Spring では Constructor Injection もサポートされています。不完全な状態でのインスタンス化を防ぐことができるためこちらの方法を好む方も少なくありません。Player クラスは Setter Injection の説明で使用したものを、Person クラスは以下のものを使用します。

package com.techscore.spring.di;

public class Person {
    private String name;
    private Player player;

    public Person(String name, Player player) {
        this.name = name;
        this.player = player;
    }

    public String getName() {
        return name;
    }

    public void listenMusic() {
        this.player.play();
    }
}

Bean 定義ファイルは以下の通りです。

<bean id="yamada" class="com.techscore.spring.di.Person">
  <constructor-arg>
    <value>Yamada Taro</value>
  </constructor-arg>
  <constructor-arg>
    <ref bean="player"/>
  </constructor-arg>
</bean>
<bean id="player" class="com.techscore.spring.di.Player"/>

コンストラクタに引数を渡すには constructor-arg 要素を使用します。constructor-arg 要素には index, type 属性が指定可能です。

属性 説明
index 何番目の引数であるかを指定します。最初の引数を指定する場合は "0" を指定します。
type 引数の型を完全限定名で指定します。プリミティブ型も指定可能です。

Bean 定義ファイルのドキュメント順と引数の順序が対応するとは限らないので、たとえば java.io.File(String parent, String child) を使用する場合は index 属性を指定しておくのが無難です。また、java.lang.StringBuffer(int length) を使用して初期容量 10 のインスタンスを生成したいとき java.lang.StringBuffer(String str) が呼び出されないよう type 属性を指定する必要があります。

実習課題 2

Spring を使用し以下の要件を満たすコンソールアプリケーションを作成しなさい。Setter Injection と Constructor Injection のどちらもためすこと。

  • 作成するクラスはコンテナで管理する Bean 2つと実行用のクラス 1つ
  • 一方の Bean は、もう一方の Bean のクラスの型とプリミティブ型のプロパティをもつ
  • 実行クラスで何らかの出力を行いプロパティがセットされていることを確かめられるようにすること

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp