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