会话范围的bean为Spring MVC的控制器的类属性(Session scoped bean a

2019-07-04 02:11发布

我有一个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";
    }
}

所以,下一次我得/用户,我得到另一个用户I无效会话。 我期待一个不同的用户,因为用户的会话范围,但我得到了相同的用户。 我在调试模式下检查,它是内存中的同一个对象ID。 我的豆声明为这样:

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

我是新来的春天,所以我明明做错事。 我想要用户为每个会话的一个实例。 怎么样?

Answer 1:

这是预期的行为。 当你标记一个bean <aop:scoped-proxy/>为它创建一个代理。 如果没有为创建一个Java动态代理其他基于CGLIB代理创建bean的接口 - 因为你的用户类在你的情况没有一个父类/接口基于CGLIB代理会为你创建。

现在,美中不足的是,这个代理是什么将被注入到所有的类,这就是为什么你看到的只有1个实例(代理的本质),代理知道如何虽然管理范围的原因 - 只要你走通过你的类的方法,所以你的情况,如果你去通过getter和setter调用到你的用户类的属性,你应该看到合适的会话反映值。



文章来源: Session scoped bean as class attribute of Spring MVC Controller