[Seasar-user:15297] Re: 【Teeda】sessionのDIについて

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2008年 8月 7日 (木) 17:00:11 JST


小林 (koichik) です.

Date:    Thu, 7 Aug 2008 16:38:50 +0900
From:    r.m <[E-MAIL ADDRESS DELETED]>
To:      [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:15296] 【Teeda】sessionのDIについて

> また、アプリケーション起動時に
> マスター情報のInitializeをしており、その中でDaoにアクセスしています。
(略)
> ------------------ApplicationInitializer------------------
> SingletonS2ContainerFactory.init();
> S2Container container = SingletonS2ContainerFactory.getContainer();
> container.init();
> -----------------------------------------------------------
> を行っています。

そもそもこのメソッドが呼び出されるのは,
(Teeda によって) container.init() が呼び出された
場合なので,ここで container.init() を呼び出す
意味はありません.

もしかすると,Teeda による container.init() の
呼び出しと,この container.init() の呼び出しで,
このコンポーネントの初期化が 2 回行われているかも
しれません.
そのせいで

> sessionのDI時に
> sessionに複数のコンポーネントが登録されています。
> とエラーメッセージが表示されます。

という現象になっているのかもしれません.

> この部分を削除すると、sessionは正常に取得する事は出来ましたが
> 以前も同じように実装していた物が、最新のバージョンでは動作しません。

関連性がよく分かりませんが,上記コードが
無意味なのは間違いないので削除してください.

おかしな使い方をした場合の振る舞いまで互換性を
考慮しているわけではないので,動きが変わったと
言われれば,そういうこともあるかもしれません.

> また、通常マスター情報の初期化(Daoを伴う場合)はどの様に行うのが望ましいでしょうか?
> 現在の実装では、シングルトンパターンで実装しており
> 初回のgetInstance()時に初期化していまして、一番最初のアクセスがあった際に初期化するのでも
> いいのですが、なるべくならサーバー起動時い初期化したいと思っております。

現在のやり方でそうなっているはずです.

> <components>
>     <component class="jp.co.common.ApplicationInitializer">
>         <initMethod name="initialized" />
>     </component>
> </components>

このように定義されたコンポーネントは singleton に
なり,コンテナの初期化時 (Web コンテナの起動時) に
インスタンス化されます.
<initMethod> で指定したメソッドもその際に呼び出されます.
なので,このメソッドで初期化処理を記述すれば,サーバの
起動時に実行されます.


-- 
<component name="koichik">
    <property name="fullName">"Koichi Kobayashi"</property>
    <property name="email">"[E-MAIL ADDRESS DELETED]"</property>
    <property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>



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