Singletonでsessionスコープのコンポーネントを見たいなー
SeasarのMLに今まで2回か3回くらい、instance属性をsingletonにして登録したコンポーネントにrequestやsessionで登録した奴をインジェクションしようとしてコケました、と云うポストがありました。
確かに、ご長命であられますsingletonさんからすれば、どの時点のsession、どの時点のrequestをみりゃいいのよ?って話ですが、それでもsessionを見たいのってニーズは判ります。
Service層でログイン情報をどうしても参照したい時とか。
だからと云ってそれだけの理由でServiceクラスの寿命を安易にsessionやrequestに縮めちゃうのもしゃくですし、折角の設計ポリシーがおじゃんになってしまって悲しいです。
だいこんが
<component class="jp.co.rokugen.UserInfo" instance="session" /> <component class="jp.co.rokugen.service.impl.HogeServiceImpl" />
なんて場合で、このHogeServiceImplでUserInfoを読んだり書いたりしたいなー、と。
class HogeServiceImpl implements HogeService{ private UserInfo userInfo; public void execute(){ // userInfoを参照したりプロパティ更新したり } public void setUserInfo(UserInfo userInfo_){ this.userInfo = userInfo_; } }
ってすると、前述通り、アプリ起動時にコケる(んじゃないかな)。
じゃあuserInfoをメンバ変数じゃなくてローカル変数にしちゃえばいいんだよ、と。
class HogeServiceImpl implements HogeService{ public void execute(){ UserInfo userInfo = (UserInfo)SingletonS2ContainerFactory. getContainer().getComponent(UserInfo.class); //userInfoをああだこうだ } }
UserInfoを見たくなるたんびにこれじゃかなわんので
class HogeServiceImpl implements HogeService{ public void execute(){ UserInfo userInfo = UserInfo.getInstance(); //userInfoをああだこうだ } }
なんてのにしちゃって、コンテナから取得する処理をgetInstance()へ移動したりして。
こんなんしてみたんですけど、わたくし、この職業からすると実はかなりコンピュータに関しては弱者でして。
心配になってきたので、特定のユーザーだけ入れる分岐を作ってそこをブレイクポイントにして、ブラウザ2つ立ち上げて、マルチセッションでやってみました。
結果、双方のスレッドでServiceクラスのオブジェクトIDは同じで、userInfoは別になりました。後から来たスレッドに追いつき追い越されたりしても全然平気。
まあそりゃそうか、なのかなあ。
問題無いと思うけど。なにせ弱者なもんでちょっと心配。えーと、メソッドエリアでーでもスタックだからー、うーんうーん。
おっとタモリ倶楽部の時間だ。