[Seasar-user:19979] Re: 複数個所にインジェクションされたコンポーネントに対してアスペクトが効かない現象
石川雅之 - エクスマート
[E-MAIL ADDRESS DELETED]
2010年 7月 16日 (金) 18:54:41 JST
石川です。お世話になっております。
> 念のため確認ですが,現在起きているのは
> 特定の Dao (X) が一つのコンポーネント (A)
> だけに DI される場合はアスペクトが適用
> されるのに,別のコンポーネント (B) でも
> DI されるようにすると,それまでアスペクトが
> 適用されていた特定の Dao (X) にアスペクトが
> 適用されなくなるという現象ですよね?
>
> 実は Dao が二つ (X と Y) あり,二つの
> コンポーネント (A と B) に DI されている
> Dao (X) にはアスペクトが適用されないが,
> 一つのコンポーネント (C とします) にだけ
> DI されている別の Dao (Y) はアスペクトが
> 適用される,という現象ではありませんよね?
起きている現象は、おっしゃられている両方が当てはまります。
> ちなみに,EnhancedByS2AOP が付けられている
> Dao を別のコンポーネントでも DI されるように
> するとどうなるでしょうか?
AOPが適用されなくなりました。
ご教授頂いた方法(S2ContainerServlet)で確認をしてみました。
以下のような結果でした。
(パッケージ名とクラス名は伏せてあります)
○AOPが適用されているDAO
# ******Dao [****.****.****.dao.******Dao]
* instance : singleton
* autoBinding : auto
* aspect
* property
o name : jdbcManager
* toString :
**.**.**.dao.******Dao$$EnhancedByS2AOP$$[E-MAIL ADDRESS DELETED]
○AOPが適用されないDAO
# ******Dao [****.****.****.dao.******Dao]
* instance : singleton
* autoBinding : auto
* aspect
* property
o name : jdbcManager
* toString :
****.****.****.dao.******[E-MAIL ADDRESS DELETED]
aspect項には双方とも何も表示されておらず、toStringの結果以外に
差は確認できませんでした。
宜しくお願い致します。
Koichi Kobayashi さんは書きました:
> 小林 (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") が同じになっているか
> 確認してください.
>
>
--
===============================================================================
株式会社エクスマート
石川 雅之 (Masayuki Ishikawa)
〒154-0004
東京都世田谷区太子堂2−7−2
リングリングビルB棟6F
E-Mail: [E-MAIL ADDRESS DELETED] URL : http://www.exmart.co.jp
Tel : 03-6421-3868
===============================================================================
Seasar-user メーリングリストの案内