[Seasar-user:1552] Re: DelegateInterceptor:委譲先のインスタンス生成 2.1系と2.2系で違うのは何故?
jazzatny
jazzatny
2005年 3月 5日 (土) 05:18:29 JST
こんばんは。佐藤です。
丁寧な説明と対処法ありがとうございます。
S2.2系に変わる前のひがさんのblogで、AOPのクラスエンハンスを
性能のために一回のみにするとあったので、今回の件はその辺かな
と想像はしていました。
> S2.2 でこのような実装になった理由は性能です.
> S2.1 では,prototype のコンポーネントはインスタンスが取得されるたびに
> クラスのエンハンスを行っていたのですが,これだとパフォーマンスが
> あまりよくなかったために初期化時に一回だけエンハンスを行うように
> 変更したのですが,このような影響があるとは考慮が足りませんでした.
>
私のテストに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の生成は毎回です。
> 対応方法なのですが,せっかく向上したパフォーマンスを考慮すると
> MethodInterceptor をメソッド呼び出しの度にコンテナから取得するのは
> 避けたいと考えています.
> つまり,S2.2 では今後も MethodInterceptor のインスタンスは最大でも
> <component> 定義につき一つにしたいということです.
> 理由としては,prototype の MethodInterceptor が必要になることは
> 決して多くないと考えられることがあげられます.
ですから、問題点は委譲先の生成が一回のみになってしまうということです。
バイトコードエンジニアリングについては勉強不足なので、変なことをいって
いるかもしれませんが、これはMethodInterceptorのクラスエンハンスという
技術上の問題で仕方がないことなのでしょうか。
diconの定義(targetのインスタンス管理はprototype)と結果が
AOPのときのみ一致しないのは、なれるまでピンとこない感じがします(特に
はじめてS2に触れる人)し、なにより直感的ではないですよね。
技術上の問題で仕方がないなら、やはり性能をとるべきだと思いますし、
小林さんの示してくれた、PrototypeDelegateInterceptorで問題ないと
思います。
ただ、その際には混乱のないよう十分な解説文が必要となりますね。
みなさん、どうでしょうか。
Seasar-user メーリングリストの案内