今週がPluggable Annotation Processing APIの最終回です。最終回ということもあるので,少し役に立ちそうなサンプルを作ってみることにします。今回作成するのは,簡易DIコンテナです。

ここで作成するDIコンテナが“簡易”というのは次の制限があるためです。

  • インタフェースの実装クラスをインタフェース名+Implに決め打ち
  • インタフェースと実装クラスが同じパッケージ
  • インジェクションはコンストラクタインジェクションのみ

その他にもいろいろと制約がありますが,簡易ということでご容赦ください。

この簡易DIコンテナで使用するアノテーションはComponentアノテーションとInjectionアノテーションの2種類です。どちらも要素は取らないマーカーアノテーションです。

まずは,簡易インタフェースの使い方を説明しましょう。クラスAがインタフェースBに依存しているとします。この場合,上記のアノテーションを使用して,次のように記述します。

public interface B {
    public void b();
}
         
@Component
public class A {
    @Injection
    public A(B b) { ... }
 
        ...
}

DIコンテナで扱うクラスはComponentアノテーションでクラスを修飾します。そして,依存関係のあるインタフェースはコンストラクタにInjectionアノテーションを付加します。

このクラスAを使用するクライアントは次のようにします。

    DIContainer container = new DIContainer();
    A a = (A)container.getComponent(A.class);

ちょっと見,Google Guiceのような感じです。とはいうものの,Google Guiceで行うインタフェースと実装クラスのバインドを,実装クラスを決め打ちにすることにより簡略化しています。