「Spring/Spring AOP」の編集履歴(バックアップ)一覧はこちら
Spring/Spring AOP - (2011/12/24 (土) 00:16:50) の1つ前との変更点
追加された行は緑色になります。
削除された行は赤色になります。
-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
-Using AspectJ with Spring applications
TODO
-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