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