目次へ

1.3. Dependency Injection のタイプ

Dependency Injection には主に 3つのタイプがあります。Interface Injection, Setter Injection, Constructor Injection です。以下の Person クラスに Player を Inject することをそれぞれのタイプで説明します。

public class Person {
    private Player player;
    public void listenMusic() {
        player.play();
    }
}

Interface Injection

まず最初に Injection 用のインタフェースを定義して Injection を行う方法を説明します。この方法を採用しているフレームワークの代表的なものとして Avalon が挙げられます。この方法では最初に Injection を行うためのインタフェースを定義することから始めます。以下は、Player をオブジェクトに Inject するためのインタフェースです。

public interface InjectPlayer {
    public void injectPlayer(Player player);
}

Player を利用したいクラスは必ず InjectPlayer インタフェースを実装しなければなりません。ここでは Person クラスがそれに該当します。

public class Person implements InjectPlayer {
    private Player player;
    public void listenMusic() {
        player.play();
    }
    public void injectPlayer(Player player) {
        this.player = player;
    }
}

コンテナは定義されたインタフェースにより依存関係を解決します。

Setter Injection

次に Setter メソッドを定義して Injection を行う方法を説明します。この方法を採用しているフレームワークには Spring のほか WebWork が挙げられます。この方法ではオブジェクトを Inject するクラスに Inject されるべきオブジェクトを引数にとる setter メソッドを定義します。

public class Person {
    private Player player;
    public void setPlayer(Player player) {
        this.player = player;
    }
    public void listenMusic() {
        player.play();
    }
}

コンテナは定義された setter メソッドにより依存関係を解決します。

Constructor Injection

最後にコンストラクタを定義して Injection を行う方法を説明します。この方法を採用しているフレームワークには PicoContainer が挙げられます。この方法ではオブジェクトを Inject するクラスに Inject されるべきオブジェクトを引数にとるコンストラクタを定義します。

public class Person {
    private Player player;
    public Person(Player player) {
        this.player = player;
    }
    public void listenMusic() {
        player.play();
    }
}

コンテナは定義されたコンストラクタにより依存関係を解決します。

Spring は Setter Injection と Constructor Injection とをサポートしていますが、Spring は Setter Injection を支持しているようです。

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp