4.5. S2Aopで用意されているInterceptor

4.5.1. TraceInterceptor

トレース処理を「Crosscutting Concern」として扱うためのInterceptorです。
例として、次のようなサービスクラスにアスペクトしてみます。

module Example
  class Service
    s2comp
    def add(a, b) {
      puts "#{self.class.superclass.name}.add called."
      return a + b
    end
  end
end

次のような実行スクリプトを作成します。

  • S2ApplicationContext.aspectメソッドでサービスコンポーネントにTraceInterceptorをアスペクトする設定とします。
  • S2ApplicationContext.createメソッドでコンテナを生成します。
  • S2Containerのget_componentメソッドでServiceコンポーネントを取得します。
  • Serviceコンポーネントのaddメソッドを実行します。
require 's2container'
require 'example'

Seasar::Container::S2ApplicationContext.aspect(:pattern => Example::Service, :interceptor => Seasar::Aop::Interceptor::TraceInterceptor.new)
container = Seasar::Container::S2ApplicationContext.create
service   = container->get(Service)

p service.add(2, 3)

上記スクリプトを実行すると、サービスクラスのaddメソッドの実行時TraceInterceptorがログを出力します。

% ruby run.rb
D, [2009-01-01] DEBUG -- Seasar::Aop::Interceptor::TraceInterceptor: before : Example::Service.add([2, 3])
Example::Service.add called.
D, [2009-01-01] DEBUG -- Seasar::Aop::Interceptor::TraceInterceptor: after  : Example::Service.add([2, 3]) : 5 : 0.002727
5
%
[注意]NOTE

この例は example/example10 にあります。


4.5.2. Interceptorを実装する

Interceptorをカスタム実装する場合は、callメソッドを実装するクラスを作成します。
次のようなサンプルインターセプターを作成してみます。

module Example
  class SampleInterceptor
    def call(invocation)
      puts 'Before'            # <-- 次のインターセプターや実際のメソッドを呼び出す前の処理
      result = invocation.proceed
      puts 'After'             # <-- 次のインターセプターや実際のメソッドを呼び出した後の処理
      return result
    end
  end
end

MethodInvocation.proceed を実行すると、次のインターセプターや実際のメソッドを呼び出します。 1つのコンポーネントに複数のアスペクトが定義されている場合は、以下のよう実行されます。

  • Aspectの登録順にInterceptorのBefore部分が実行されます。
  • 最後のInterceptorのBefore部分を実行した後にコンポーネント自身のメソッドが呼び出されます。
  • Aspectの登録の逆順にInterceptorのAfter部分が実行されます。

Interceptor.callメソッドの引数で渡されるMethodInvocationインスタンスを介して、アスペクト対象のインスタンスや、 クラス、メソッド引数などを取得できます。

[注意]NOTE

この例は example/example11 にあります。



© Copyright The Seasar Foundation and the others 2008-2009, all rights reserved.