3

私はユーザークラスを持っています:

@Component
@Scope("session")
public class User {
    private String username;
}

そしてコントローラークラス:

@Controller
public class UserManager {
    @Autowired
    private User user;

    @ModelAttribute("user")
    private User createUser() {
        return user;
    }

    @RequestMapping(value = "/user")
    public String getUser(HttpServletRequest request) {
        Random r = new Random();
        user.setUsername(new Double(r.nextDouble()).toString());
        request.getSession().invalidate();
        request.getSession(true);
        return "user";
    }
}

次回/usersにアクセスしたときに別のユーザーを取得できるように、セッションを無効にします。ユーザーのセッション スコープのために別のユーザーを期待していますが、同じユーザーを取得します。デバッグ モードでチェックしたところ、メモリ内の同じオブジェクト ID です。私のBeanは次のように宣言されています:

    <bean id="user" class="org.synchronica.domain.User">
        <aop:scoped-proxy/>
    </bean>

私は春が初めてなので、明らかに何か間違っています。セッションごとに User のインスタンスが 1 つ必要です。どのように?

4

1 に答える 1

3

これは予想される動作です。<aop:scoped-proxy/>Beanにプロキシをタグ付けすると、そのBean用に作成されます。Beanのインターフェースがある場合は、Java動的プロキシが作成されます。それ以外の場合は、CGLIBベースのプロキシが作成されます。この場合、ユーザークラスには親クラス/インターフェースがないため、CGLIBベースのプロキシが作成されます。

ここで問題となるのは、このプロキシがすべてのクラスに注入されることです。これが、(プロキシの基本的に)1つのインスタンスしか表示されない理由ですが、プロキシはスコープの管理方法を知っています-あなたが行く限りクラスのメソッドを介して、したがって、あなたの場合、あなたがあなたのUserクラスのプロパティに到達するためにgetterとsetterの呼び出しを通過するならば、あなたは反映されたセッションに適切な値を見るはずです。

于 2012-11-23T17:01:34.390 に答える