Re: AOPを使ったキャッシュの実現

Rickardの回答:


  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を用意したことです。

  1. アクセスしたトータルを記録するadvice
  2. キャッシュが存在すればそれを返し、さもなければ計算した値をキャッシュするadvice
  3. キャッシュミスを記録するadvice

2番目のadviceでは、そのinterceptorはキャッシュがヒットしたときには、次のinterceptorを呼出さないようになっています。したがって、3番目のadviceに制御が移るのはキャッシュミスの場合だけです。それぞれが独立したadviceなので、adviceを他の実装に入れ換えても他のadviceへの影響はありません。

この解は巧妙ではありますが、interceptor stack上でのinterceptorの順番に依存するという欠点があります。つまり、interceptor順番を入れ替えただけで動作しなくなるし、stackが複雑な場合には、そのような「バグ」は簡単には見つからないでしょう。