[[FAQ]]

*S2AOP [#db17a433]

#contents

**diconでOGNL式にaspect適用可能か? [#d29c919e]
>[[S2サポーター]] (2006-04-29 (土) 16:32:41)~
~
''Question''~
diconファイルで、OGNL式で取得したコンポーネントに対して~
アスペクトを適用するように記述することは可能でしょうか?~
~
 以下のように書きたかったのですが、エラーになります。~
~
 <component>
     @hogeFactory @ HOGE
     <aspect>hogeInterceptor</aspect>
 </component>
~
''Answer''~
できません.~
~
S2AOP は,元のクラスを継承したサブクラスを作成します.~
アスペクトが適用されるのはそのサブクラスのインスタンスに~
なります.~
OGNL で取得したコンポーネントはすでにインスタンス化されて~
しまっており,S2AOP が作成したサブクラスのインスタンスでは~
ないためアスペクトは適用されません.~
~
DelegateInterceptor を使えばやりたいことが~
できるかもしれません.~
~
 <component class="...">
   <aspect>hogeInterceptor</aspect>
   <aspect>
     <component class="org.seasar.framework.aop.interceptors.DelegateInterceptor">
       <property name="target">@hogeFactory @ HOGE</property>
     </component>
   </aspect>
 </component>
~
一番外側の <component> 要素には class 属性を指定する必要があります.~
インタフェースを指定しても構いません.このコンポーネントを取得してメソッドを呼び出すと,~
最初に hogeInterceptor が適用され,その後にDelegateInterceptor が適用されます.~
~
DelegateInterceptor は target プロパティに指定されたコンポーネントに委譲します
(同じメソッドを呼び出します).
~
当然ですが,コンテナから取得したコンポーネントのメソッドを呼び出さないとアスペクトは適用されません.~
hogeFactory.HOGE のメソッドを呼び出してもダメです.~
>
''参考投稿''~
http://ml.seasar.org/archives/seasar-user/2006-April/005405.html~
http://ml.seasar.org/archives/seasar-user/2006-April/005408.html

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS