目次へ

2.3. Setter Injection

前節で BeanFactory から Bean を取り出しました。この節では Setter Injection を例に取り上げ DI コンテナの役割である依存性の解決をどのようにして行うのかを説明します。以下は BeanFactory で管理する Person クラスと Player クラスです。

package com.techscore.spring.di;

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setPlayer(Player player) {
        this.player = player;
    }

    public void listenMusic() {
        this.player.play();
    }
}
package com.techscore.spring.di;

public class Player {
    public void play(){
        System.out.println("playing music...");
    }
}

ここでは Player クラスを具象クラスとしていますが、たとえば、Player をインタフェースとし、それを実装した CdPlayer クラスを作成するとクラス間の結合度がより疎となります。以下に Person クラスと Player クラスの依存性を解決する Bean 定義ファイルを示します。

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

Bean のプロパティを設定するには bean 要素の子要素として property 要素を使用します。そして name 属性で値をセットするプロパティ名を指定します。ここで指定したプロパティ名に対応する setter メソッドが呼ばれ値がセットされます。
セットする値がプリミティブ型や java.lang.String 型の場合は value 要素で指定します。サンプルでは name というプロパティに "Yamada Taro" という文字列をセットしています。 Bean 定義ファイルに定義されている Bean をプロパティとしてセットするには value 要素ではなく ref 要素を使用し、bean 属性でセットする Bean の名前を指定します。サンプルでは player という名前で定義された Bean を yamada という名前で定義された Bean の player プロパティにセットしています。

package com.techscore.spring.di;

import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

public class Main {
    public static void main(String[] args) {
        ClassPathResource res = new ClassPathResource(
                "/com/techscore/spring/di/beans.xml");
        XmlBeanFactory factory = new XmlBeanFactory(res);
        Person yamada = (Person) factory.getBean("yamada");
        System.out.println("[name=" + yamada.getName() + "]");
        yamada.listenMusic();
    }
}

最初の例では org.springframework.core.io.FileSystemResource クラスを使用して設定ファイルの読み込みを行いましたがプログラム実行時のカレントディレクトリに依存するため使い勝手がよくありません。ここでは org.springframework.core.io.ClassPathResource クラスを使用して設定ファイルの読み込みを行っています。コンストラクタの引数に、クラスパスが通っているディレクトリをルートとする相対または絶対指定でファイルパスを指定します。実行すると以下の出力を得ます。

[name=Yamada Taro]
playing music...

プロパティ値に空文字列や null を設定するには以下のようにします。

<bean id="yamada" class="com.techscore.spring.di.Person">
  <property name="name">
    <value></value>
  </property>
  <property name="player">
    <null/>
  </property>
</bean>

上記の Bean 定義ファイルは name プロパティに空文字列を player プロパティに null をセットします。

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp