[Seasar-user:3494] Re: diconでOGNL式にaspect適用可?
Koichi Kobayashi
[E-MAIL ADDRESS DELETED]
2006年 4月 13日 (木) 01:00:20 JST
小林 (koichik) です.
Date: Wed, 12 Apr 2006 12:39:09 +0900
From: Asarima <[E-MAIL ADDRESS DELETED]>
To: Seasar-user ML <[E-MAIL ADDRESS DELETED]>
Subject: [Seasar-user:3491] diconでOGNL式にaspect適用可?
> diconファイルで、OGNL式で取得したコンポーネントに対して
> アスペクトを適用するように記述することは可能でしょうか?
できません.
S2AOP は,元のクラスを継承したサブクラスを作成します.
アスペクトが適用されるのはそのサブクラスのインスタンスに
なります.
OGNL で取得したコンポーネントはすでにインスタンス化されて
しまっており,S2AOP が作成したサブクラスのインスタンスでは
ないためアスペクトは適用されません.
DelegateInterceptor を使えばやりたいことが
できるかもしれません.
<component class="...">
<aspect>hogeInterceptor</aspect>
<aspect>
<component class="org.seasar.framework.aop.interceptors.DelegateInterceptor">
<property name="target">@[E-MAIL ADDRESS DELETED]</property>
</component>
</aspect>
</component>
一番外側の <component> 要素には class 属性を指定する
必要があります.インタフェースを指定しても構いません.
このコンポーネントを取得してメソッドを呼び出すと,
最初に hogeInterceptor が適用され,その後に
DelegateInterceptor が適用されます.
DelegateInterceptor は target プロパティに指定された
コンポーネントに委譲します (同じメソッドを呼び出します).
当然ですが,コンテナから取得したコンポーネントの
メソッドを呼び出さないとアスペクトは適用されません.
hogeFactory.HOGE のメソッドを呼び出してもダメです.
--
<signature>
<name>Koichi Kobayashi</name>
<e-mail>[E-MAIL ADDRESS DELETED]</e-mail>
</signature>
Seasar-user メーリングリストの案内