[Seasar-user:1566] Re: instance 属性について
Koichi Kobayashi
koichik
2005年 3月 7日 (月) 01:33:38 JST
小林 (koichik) です.
On Sun, 06 Mar 2005 19:13:55 +0900
yamagoo <[E-MAIL ADDRESS DELETED]> wrote:
> > インスタンスをrequest(の属性)で管理するという意味で、
> > requestをDIするという意味ではありません。
>
> なるほど。DIしたいときはsetRequestすればよいということですね。
えと,ひがさんのコメントがうまく伝わってるかよくわからないので
横から失礼します.蛇足だったらごめんなさい.
S2.1 以降,もはやアプリケーション (コンポーネント) が
HttpServletRequest#setAttribute() や HttpSession#setAttribute() を
直接呼び出す必要はありません.それはコンテナの仕事です.
それはちょうど,コンポーネントを直接 new する必要が無くなったのと
似ています.
S2.1 以降では,例えばログイン情報をセッションで保持したい場合には
アプリケーションで HttpSession#setAttribute() するのではなく,
かわりにログイン情報のクラスを instance="session" で diocn ファイルに
記述します.
それだけで,コンテナがログイン情報をセッションに設定してくれます.
コンテナの中では当然 HttpServletRequest#setAttribute() や
HttpSession#setAttribute() が呼び出されます.
例えば instance="request" なコンポーネントを getComponent() すると
こんなコードが実行されます.
----------------------------------------------------------------------
Object component = request.getAttribute(componentName);
if (component != null) {
return component;
}
component = getConstructorAssembler().assemble();
request.setAttribute(componentName, component);
getPropertyAssembler().assemble(component);
getInitMethodAssembler().assemble(component);
return component;
----------------------------------------------------------------------
コンポーネントが既に request に設定されていればそれを返し,
そうでなければ新しいインスタンスを作成して request に設定してくれます.
このため,アプリケーション側のコンポーネントが setRequest() や
setSession() を実装して HttpServletRequest や HttpSession を
DI してもらう必要はほとんどないと思います.
--
<signature>
<name>Koichi Kobayashi</name>
<e-mail>[E-MAIL ADDRESS DELETED]</e-mail>
</signature>
Seasar-user メーリングリストの案内