[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 メーリングリストの案内