4.3. S2AopFactoryを用いてAspectする

S2AopFactoryクラスのcreateメソッドを用いて、あるクラスの拡張クラスを生成し、アスペクトを織り込んだインスタンスを取得します。

S2AopFactory.create(component_class, aspects) 
  • 第1引数 : Aspect対象クラス
  • 第2引数 : 織り込むAspectの配列

例として、次のようなサービスクラスにAspectを適用してみます。

module Example
  class Service
    def add(a, b)
      return a + b
    end
  end
end

ServiceクラスのaddメソッドにTraceInterceptorをAspectします。

require 's2container'
require 'seasar/aop/s2aop-factory'
require 'seasar/aop/aspect'
require 'seasar/aop/pointcut'
require 'example'

interceptor = Seasar::Aop::Interceptor::TraceInterceptor.new
pointcut    = Seasar::Aop::Pointcut.new(/^add$/)
aspect      = Seasar::Aop::Aspect.new(interceptor, pointcut)
service     = Seasar::Aop::S2AopFactory::create(Example::Service, [aspect]).new

p service.add(2, 3)

Interceptor. 

callメソッドを実装するクラスです。S2Aopでは、次のインターセプターがバンドルされています。

  • Seasar::Aop::Interceptor::TraceInterceptor
    トレース処理を「Crosscutting Concern」として扱うためのInterceptorです。

Pointcut. 

Interceptorがどこに適用されるのかをあらわすクラスです。

Seasar::Aop::Pointcut.new(target)

コンストラクタ引数のtargetには、Pointcutとなるメソッドを特定する正規表現、文字列、またはSymbolを渡します。

Aspect. 

Interceptor(Advice)とPointcutを関連付けるクラスです。

Seasar::Aop::Aspect.new(interceptor, pointcut)

コンストラクタ引数でInterceptorとPointcutを指定します。

[注意]NOTE

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



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