Guiceを使ったAOP(2) 〜 Matchersクラス
Guiceで、AOPを利用するためのポイントとなるのは、設定を記述するModuleです。
今回は、MyModuleを分解して行きます。
まずは、昨日と同じソースコード。(行番号を振りました)
01: package net.kronos_jp.guice.aop; 02: 03: import com.google.inject.AbstractModule; 04: import static com.google.inject.matcher.Matchers.*; 05: 06: public class MyModule extends AbstractModule { 07: 08: protected void configure() { 09: bind(Dependency.class).to(DependencyImpl.class); 10: bindInterceptor(any(), any(), new LoggingInterceptor()); 11: } 12: }
行04で、Matchersクラスをスタティックインポートしています。
これでMatchersクラスのスタティックメソッドを、メソッド名のみで呼び出すことができます。
MatchersクラスはMatcherインターフェイスの実装ですが、直接new演算子でインスタンスを生成して使うのではなく、定義されたstaticメソッドを利用してインスタンスを取得します。
このとき利用するstaticメソッドの種類によって様々なMatcherインスタンスを使い分けることが出来ます。
このMatcherオブジェクトを引数に取るbindInterceptor()メソッドは、インターセプターを織り込む対象クラス・対象メソッドを指定し、織り込むべきインターセプターを指定します。
N番目の引数 | 引数名 | 意味 |
---|---|---|
第1引数 | classMatcher | インターセプターが適用されるべきクラスにマッチするMatcherを渡します。 |
第2引数 | methodMatcher | インターセプターが適用されるべきメソッドにマッチするMatcherを渡します。 |
第3引数 | interceptors | 適用するインターセプターを指定します。MethodInterceptor型の可変長パラメータです。 |
例えば以下のように指定すると、Runnableクラスの@Transactionalで注釈されたメソッドに、LoggingInterceptorインターセプターを織り込みます。
bindInterceptor( only(Runnable.class), annotatedWith(Transactional.class), new LoggingInterceptor() );
このとき、only()やannotatedWith()、また前述のサンプル中のany()というメソッドは、
Matchersクラスのスタティックインポートによって利用可能になっています。
以下で、Matchersクラスのスタティックメソッドをおさらいしておきましょう。
Method | Summary |
---|---|
static Matcher |
与えられたアノテーションにマッチするメソッドやクラスのエレメントであるmatcherを返します。 |
static Matcher |
与えられたアノテーションにマッチするメソッドやクラスのエレメントであるmatcherを返します。 |
static Matcher | 全ての入力に一致するmatcherを返します。 |
static Matcher | 与えられたオブジェクトのみにマッチするmatcherを返します。 |
static Matcher |
与えられたパッケージの中のクラスにマッチするmatcherを返します。 |
static |
与えられたmatcherを反転します。 |
static Matcher | 与えられたオブジェクトと等しい(equal)オブジェクトにマッチするmatcherを返します。 |
static Matcher |
戻り値の型が一致するメソッドにマッチするmatcherを返します。 |
static Matcher |
与えられた型のサブクラスに一致するmatcherを返します。(与えられた型にも作用します) |