今週が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で行うインタフェースと実装クラスのバインドを,実装クラスを決め打ちにすることにより簡略化しています。

この先は会員の登録が必要です。有料会員(月額プラン)は申し込み初月無料!

日経 xTECHには有料記事(有料会員向けまたは定期購読者向け)、無料記事(登録会員向け)、フリー記事(誰でも閲覧可能)があります。有料記事でも、登録会員向け配信期間は登録会員への登録が必要な場合があります。有料会員と登録会員に関するFAQはこちら