[Seasar-user:3003] [S2Container][S2AOP]相談 - aspectに適用するインスタンスのinstanceについて

Hikaru Taniguchi taniguchi
2005年 12月 7日 (水) 23:28:57 JST


たにぐちです。

S2.3.4 + S2Struts + POJO Action で開発中のシステムがあります。 POJO Actionです
ので Actionのインスタンスは instance="request" 相当です。

ここで、アクション向けの共通処理をまとめたInterceptorが存在します。こ
のInterceptorも同じく requestやresponseを使って処理を行うのですが、実
際に動作させてみると

(1回目のリクエスト)
    interceptorがインスタンス化される
    actionがインスタンス化される
    interceptorが走る
    actionが走る (interceptorが invocation.proceed()しているので)

(2回目のリクエスト)
    actionがインスタンス化される
    (1回目のリクエストで生成されたインスタンスの)interceptorが走る
    .
    .

となり、動作が不可解なものになります。

少し追いかけてみると、ComponentDefImpl#getConcreteClass() で
AopProxyUtilを使ってclassをラッピングするのは一度きりになっているよう
です。

つまり、interceptorのライフサイクルをprototypeやrequestにしたところで、
aspect適用先のクラスをアドバンスするのは一度きりに見えるので、リクエス
トごとに異なるアドバンスはできません。

…と実はここまでが前置きです。


実際に requestごとにクラスをアドバンスするのはパフォーマンスの問題もし
かりですが、PermGenを圧迫する、というデメリットもあると思っています。
ですが、リクエストやレスポンスに依存した処理もinterceptorでしたい…

とすると、interceptorは S2Containerに依存してしまって、 containerから
request,responseを貰う…というような方法しかないもんでしょうか?

なんというか、少し違和感を感じる(コンテナに依存することに対する漠然と
した違和感?)のですが、仕方ないもんでしょうか。

先輩方、なにかご意見を頂けますと幸いです。

--
Hikaru Taniguchi <taniguchi @ furyu.omron.co.jp>


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