Re: AOPを使ったキャッシュの実現
total miss ...
これはNanningというAOP実装を使った解です。Nanningのinterceptorとは、JBossAOPと同様に、AOPのadviceのことです。Nanningではオブジェクトに設定されたinterceptorのチェイン(interceptor stack)を順次実行していくことでAOPを実現しています。
interceptor stackでは各interceptorが次のような構造をもっています。
public class CacheInterceptor implements Interceptor { public Object invoke(Invocation invocation) throws Throwable { // このinterceptorの処理をする。 Object value = invocation.next(); // 次のinterceptorを呼出す。 return value; } }
この解の要点は、次の3つのadviceを用意したことです。
- アクセスしたトータルを記録するadvice
- キャッシュが存在すればそれを返し、さもなければ計算した値をキャッシュするadvice
- キャッシュミスを記録するadvice
2番目のadviceでは、そのinterceptorはキャッシュがヒットしたときには、次のinterceptorを呼出さないようになっています。したがって、3番目のadviceに制御が移るのはキャッシュミスの場合だけです。それぞれが独立したadviceなので、adviceを他の実装に入れ換えても他のadviceへの影響はありません。
この解は巧妙ではありますが、interceptor stack上でのinterceptorの順番に依存するという欠点があります。つまり、interceptor順番を入れ替えただけで動作しなくなるし、stackが複雑な場合には、そのような「バグ」は簡単には見つからないでしょう。