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