Spring > Spring AOP

  • Spring AOPのJoin pintの対象はビーンのメソッド実行のみ
  • AOPコンセプト
    • Aspect
    • Join point
    • Advice
    • Pointcut
    • Introduction
    • Target object
    • AOP proxy
    • Weaving
  • AOPの選択
    • Spring AOP vs AspectJ ⇒ 相互に補完
    • @AspectJ スタイル vs XML スタイル
  • @AspctJを使う
    • xmlの設定
      <aop:aspectj-autoproxy/>
      
    • 必要なJar:aspectjweaver.jar, aspectjrt.jar
  • pointcut
    • pintcutの定義
      • pointcutにマッチするのは、pubicなメソッドのみ
      • pointcut expression⇒@Pointcut
      • pointcut signature⇒戻り値voidのメソッド
    • PCD
      • execution
      • within
      • this
      • target
      • args
      • @target
      • @args
      • @within
      • @annotation
      • bean (*ワイルドカード利用可)
    • pointcutの結合:&& , | , !
      • pointcutの結合で、@Pointcutメソッド名の可視性はJavaと同じ
    • executionの書き方
      execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)
      
    • PCDでは、なるべく絞り込むように記述する。⇒ weaving時のパフォーマンスがよくなる。
      • 少なくともkindedとscopingを含むように。
  • advise
    • 種類 : 一番少ないコードで実装できるものを選ぶべき
      • @Before(pointcut)
      • @AfterReturning(pointcut,returning) -> メソッドの戻り値型のマッチング制約も同時につけられる
      • @AfterThrowing(pointcut, throwing) -> 例外の型のマッチング制約も同時につけられる
      • @After(pointcut)
      • @Around(pointcut)
  • pointcutとの紐付
    • pointcut名 or pointcut表現
  • join pointへのアクセス
    • メソッドの第一パラメータにJoinPoint(@AroundメソッドはProceedingJoinPoint)を指定できる(任意)
  • pointcut 表現でargsを使って、メソッドの引数の型を明示的に指定できる
    @Before(XXX && args(hoge,..)) public void do(Hoge hoge){ ... }
    
    • join pointのマッチングでパラメータの型も見てくれる。
  • pointcut のargNames属性でパラメータの名前を指定してメソッドで使うことができる。
    @Before(XXX, argNames="hoge") public void do(Hoge hoge){ ... }
    
  • adviceの実行順序は、優先度の高いものから「先に入って、後からでてくる」
    • 優先度の設定は、org.springframework.core.Ordered を実装するか、@Order をつける
  • Introductions
  • TODO:Schema-based AOP support
  • AOPのスタイルの選択
    • Spring AOP vs. AspectJ
      • AOPの対象がSpringのビーンのメソッド⇒Spring AOPで十分
      • AOPの対象がSpringコンテナ管理外のDOとか、join pointがメソッド以外⇒AspectJ必要
    • Spring AOP の @AspectJ vs. XML
      • Java 5より前⇒XML
      • XMLだと、システム内に存在するアスペクトが明確
      • XMLだと、AOPの機能がクラスとXMLに分割して書かれてしまう。(DRY原則に違反)
      • XMLだと、@AspectJのように、pointcutの組み合わせを定義できない
      • @AspectJをつかっていれば、AspectJに移行しやすい
  • Proxying mechanisms
    • J2SEダイナミックプロキシ
      • インターフェースへのプロキシ(default)
    • CGILIB
      • クラスへのプロキシ(インターフェースなし、インターフェース以外のメソッド)
      • finalメソッドはadvise不可
      • CGLIBのライブラリが必要
      • コンストラクタが2回呼ばれる(actualとproxied)
      • CGLIBの強制
        <aop:config proxy-target-class="true"/>
        
        <aop:aspectj-autoproxy proxy-target-class="true"/>
        
  • AOP Proxyでのself-invocationについて
    • this参照での呼び出しではadviseは実行されない
    • self-invocationをしたい場合のいけてないやり方
      ((Pojo) AopContext.currentProxy()).bar();
      
  • @AspectJ Proxyのプログラマティックな生成 : AspectJProxyFactory
  • TODO:Using AspectJ with Spring applications
最終更新:2011年12月24日 00:16
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。