[Seasar-user:1553] Re: DelegateInterceptor:委譲先のインスタンス生成 2.1系と2.2系で違うのは何故?

Koichi Kobayashi koichik
2005年 3月 5日 (土) 05:53:16 JST


小林 (koichik) です.

On Sat, 05 Mar 2005 05:18:21 +0900
jazzatny <[E-MAIL ADDRESS DELETED]> wrote:

> 私のテストにdelegateされるクラスのインスタンスを出力するよう
> に加えてみます。
> 
> ------------------------------------------
> public class DelegateTest extends S2TestCase {
>      public void testDelegate(){
>          for (int i = 0; i < 5; i++){
>              Introduce introduce =
>                     (Introduce) getComponent("introduce");
>              System.out.println(introduce); // <- ここ
>              introduce.introduceMySelf();
>          }
>      }
> }
> 
> 結果
> $$test.instance.Introduce$$EnhancedByS2AOP$$[E-MAIL ADDRESS DELETED]
> [E-MAIL ADDRESS DELETED]
> $$test.instance.Introduce$$EnhancedByS2AOP$$[E-MAIL ADDRESS DELETED]
> [E-MAIL ADDRESS DELETED]
> $$test.instance.Introduce$$EnhancedByS2AOP$$[E-MAIL ADDRESS DELETED]
> [E-MAIL ADDRESS DELETED]
> $$test.instance.Introduce$$EnhancedByS2AOP$$[E-MAIL ADDRESS DELETED]
> [E-MAIL ADDRESS DELETED]
> $$test.instance.Introduce$$EnhancedByS2AOP$$[E-MAIL ADDRESS DELETED]
> [E-MAIL ADDRESS DELETED]
> ------------------------------------------
> 
> クラスエンハンスは一回、DelegateInterceporの生成は毎回です。

いいえ,ここで表示されているのは「Introduce を実装したオブジェクト」
であり,それは DelegateInterceptor ではありません.
すべての「Introduce を実装したオブジェクト」において,
DelegateInterceptor は同じものが使われます.

> バイトコードエンジニアリングについては勉強不足なので、変なことをいって
> いるかもしれませんが、これはMethodInterceptorのクラスエンハンスという
> 技術上の問題で仕方がないことなのでしょうか。

いいえ,単なるトレードオフです.

> diconの定義(targetのインスタンス管理はprototype)と結果が
> AOPのときのみ一致しないのは、なれるまでピンとこない感じがします(特に
> はじめてS2に触れる人)し、なにより直感的ではないですよね。

そうですね,直感的でないのは確かだと思います.
とはいえ,singleton なコンポーネントのプロパティに prototype な
コンポーネントを設定した場合には似たような感覚になりやすいと
思います.
コンポーネントのライフサイクルは,それ自身だけではなく,それを
取得する側とも密接に関係してくるのは AOP には限りません.

> 技術上の問題で仕方がないなら、やはり性能をとるべきだと思いますし、
> 小林さんの示してくれた、PrototypeDelegateInterceptorで問題ないと
> 思います。
> 
> ただ、その際には混乱のないよう十分な解説文が必要となりますね。

あう,頑張ります...


-- 
<signature>
    <name>Koichi Kobayashi</name>
    <e-mail>[E-MAIL ADDRESS DELETED]</e-mail>
</signature>




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