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