レベルエンター山本大のブログ

面白いプログラミング教育を若い人たちに

BLOCKVROCKリファレンス目次はこちら

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 annotatedWith(Annotation annotation) 与えられたアノテーションにマッチするメソッドやクラスのエレメントであるmatcherを返します。
static Matcher annotatedWith(Class annotationType) 与えられたアノテーションにマッチするメソッドやクラスのエレメントであるmatcherを返します。
static Matcher any() 全ての入力に一致するmatcherを返します。
static Matcher identicalTo(Object o) 与えられたオブジェクトのみにマッチするmatcherを返します。
static Matcher inPackage(Package p) 与えられたパッケージの中のクラスにマッチするmatcherを返します。
static Matcher not(Matcher p) 与えられたmatcherを反転します。
static Matcher only(Object o) 与えられたオブジェクトと等しい(equal)オブジェクトにマッチするmatcherを返します。
static Matcher returns(Matcher> returnType) 戻り値の型が一致するメソッドにマッチするmatcherを返します。
static Matcher subclassesOf(Class superclass) 与えられた型のサブクラスに一致するmatcherを返します。(与えられた型にも作用します)