会话范围bean作为Spring MVC Controller的类属性

我有一个User类:

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

还有一个Controller类:

 @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被声明为:

     

我刚开始spring,所以我显然做错了什么。 我希望每个会话都有一个User实例。 怎么样?

这是预期的行为。 使用标记bean时,会为其创建代理。 如果存在bean的接口,则创建java动态代理,否则创建基于CGLIB的代理 – 在您的情况下,因为您的User类没有父类/接口,所以将为您创建基于CGLIB的代理。

现在的问题是,这个代理将被注入到所有类中,这就是为什么你只看到一个实例(代理本质上),代理知道如何管理范围 – 只要你去通过你的类的方法,所以在你的情况下,如果你通过getter和setter调用来获取User类的属性,你应该看到适合于会话的值。