加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 01:22:15 所属栏目:大数据 来源:网络整理
导读:我有一个User类: @Component@Scope("session")public class User { private String username;} 和一个控制器类: @Controllerpublic class UserManager { @Autowired private User user; @ModelAttribute("user") private User createUser() { return user;

我有一个User类:

@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实例.怎么样?

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读