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