トレース処理を「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
次のような実行スクリプトを作成します。
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 にあります。 |
Interceptorをカスタム実装する場合は、callメソッドを実装するクラスを作成します。
次のようなサンプルインターセプターを作成してみます。
module Example class SampleInterceptor def call(invocation) puts 'Before' # <-- 次のインターセプターや実際のメソッドを呼び出す前の処理 result = invocation.proceed puts 'After' # <-- 次のインターセプターや実際のメソッドを呼び出した後の処理 return result end end end
MethodInvocation.proceed を実行すると、次のインターセプターや実際のメソッドを呼び出します。 1つのコンポーネントに複数のアスペクトが定義されている場合は、以下のよう実行されます。
Interceptor.callメソッドの引数で渡されるMethodInvocationインスタンスを介して、アスペクト対象のインスタンスや、 クラス、メソッド引数などを取得できます。
NOTE | |
---|---|
この例は example/example11 にあります。 |
© Copyright The Seasar Foundation and the others 2008-2009, all rights reserved. |