[Seasar-user:19978] Re: 複数個所にインジェクションされたコンポーネントに対してアスペクトが効かない現象

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2010年 7月 16日 (金) 13:00:32 JST


小林 (koichik) です.

Date:    Fri, 16 Jul 2010 09:50:48 +0900
From:    石川雅之 - エクスマート <[E-MAIL ADDRESS DELETED]>
To:      [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:19977] Re: 複数個所にインジェクションされたコンポーネントに対してアスペクトが効かない現象

> > ・A および B に DI された X のクラス名は
> > 〜DaoImpl$$EnhancedByS2AOP$$〜 となっているか?
> 
> AにDIされたXも、BにDIされたXも、〜[E-MAIL ADDRESS DELETED]となっておりました。

つまり AOP の対象になっていないということですね.
これは何カ所に DI されるかとは何も関係がないはず
なのですが...
関係があるのは

[Seasar-user:19974]
>   <!-- コンポーネントXのアスペクト登録 -->
>   <component class="org.seasar.framework.container.autoregister.AspectAutoRegister">
>     <property name="interceptor">daoIntercept</property>
>     <initMethod name="addClassPattern">
>       <arg>"コンポーネントXのパッケージ"</arg>
>       <arg>".*Dao"</arg>

の classPattern に該当するかどうかくらいのはず.

> (他の1箇所にしかDIされないコンポーネントはEnhancedByS2AOPが付与
>  されていました。)

Dao も複数あるということですね.

念のため確認ですが,現在起きているのは
特定の Dao (X) が一つのコンポーネント (A)
だけに DI される場合はアスペクトが適用
されるのに,別のコンポーネント (B) でも
DI されるようにすると,それまでアスペクトが
適用されていた特定の Dao (X) にアスペクトが
適用されなくなるという現象ですよね?

実は Dao が二つ (X と Y) あり,二つの
コンポーネント (A と B) に DI されている
Dao (X) にはアスペクトが適用されないが,
一つのコンポーネント (C とします) にだけ
DI されている別の Dao (Y) はアスペクトが
適用される,という現象ではありませんよね?

ちなみに,EnhancedByS2AOP が付けられている
Dao を別のコンポーネントでも DI されるように
するとどうなるでしょうか?

> 少し気になったのですが、コンポーネントXはインタフェースを使用して
> おりません。関係ありますでしょうか。

Seasar 2.4 では関係ありませんが,2.3 以前だと
デフォルトでは実装しているインタフェースに
定義されているメソッドだけが AOP の対象と
なります.
AspectAutoRegister に pointcut が指定されて
いないので,インタフェースを実装していない
コンポーネントには AOP が適用されないことに
なります.

ただし,これは何カ所に DI されるかとは
無関係です.
DI されるのが一カ所であれ複数箇所であれ,
Seasar2.4 ではいずれも AOP の対象になりますが,
2.3 ではいずれも AOP の対象にはなりません.

> はい、Webアプリです。

それなら web.xml で S2ContainerServlet
またはそのサブクラス (Teeda なら TeedaServlet)
の <init-param> で debug を true にして,

<init-param>
  <param-name>debug</param-name>
  <param-value>true</param-value>
</init-param>

ブラウザで

http://<host>/<context>/s2container?command=list

にアクセスしてください.
# Teeda の場合は "s2container" が "teedaServlet"

AutoRegister を定義しているのが app.dicon なら,
そこに自動登録されたコンポーネントがずらりと
表示されるはずです.
別の dicon に定義しているのなら,インクルードの
一覧から該当の dicon のリンクを辿ってください.

そしてアスペクトが適用される Dao とされない Dao の
設定 ("aspect" や "pointcut") が同じになっているか
確認してください.


-- 
<component name="koichik">
    <property name="fullName">"Koichi Kobayashi"</property>
    <property name="email">"[E-MAIL ADDRESS DELETED]"</property>
    <property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>



Seasar-user メーリングリストの案内