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