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は別になりました。後から来たスレッドに追いつき追い越されたりしても全然平気。

まあそりゃそうか、なのかなあ。

問題無いと思うけど。なにせ弱者なもんでちょっと心配。えーと、メソッドエリアでーでもスタックだからー、うーんうーん。

おっとタモリ倶楽部の時間だ。