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

前端之家收集整理的这篇文章主要介绍了java-会话范围的bean作为Spring MVC Controller的类属性 前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我有一个User类:

  1. @Component
  2. @Scope("session")
  3. public class User {
  4. private String username;
  5. }

和一个控制器类:

  1. @Controller
  2. public class UserManager {
  3. @Autowired
  4. private User user;
  5. @modelattribute("user")
  6. private User createUser() {
  7. return user;
  8. }
  9. @RequestMapping(value = "/user")
  10. public String getUser(HttpServletRequest request) {
  11. Random r = new Random();
  12. user.setUsername(new Double(r.nextDouble()).toString());
  13. request.getSession().invalidate();
  14. request.getSession(true);
  15. return "user";
  16. }
  17. }

我使会话无效,以便下次我进入/ users时,我得到另一个用户.由于用户的会话范围,我期望使用其他用户,但是我得到的是同一用户.我在调试模式下进行了检查,它与内存中的对象ID相同.我的bean声明为:

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

我是春季新手,所以我显然做错了什么.我希望每个会话都有一个User实例.怎么样?

最佳答案
这是预期的行为.当您用< aop:scoped-proxy />标记一个bean时,为此创建一个代理.如果Bean有接口,则将创建Java动态代理,否则将创建基于CGLIB的代理-在您的情况下,由于User类没有父类/接口,将为您创建基于CGLIB的代理.

现在要注意的是,此代理将注入到您的所有类中,这就是为什么您只看到1个(本质上是代理的)实例的原因,但是代理知道如何管理范围-只要您继续通过类的方法,因此,在这种情况下,如果您通过getter和setter调用获取User类的属性,则应该看到反映了该会话的值.

猜你在找的Spring相关文章