我有一个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被声明为:
<bean id="user" class="org.synchronica.domain.User">
<aop:scoped-proxy/>
</bean>
我刚开始春天,所以我显然做错了什么。我希望每个会话都有一个User实例。怎么样?
答案 0 :(得分:3)
这是预期的行为。使用<aop:scoped-proxy/>
标记bean时,会为其创建代理。如果存在bean的接口,则创建java动态代理,否则创建基于CGLIB的代理 - 在您的情况下,因为您的User类没有父类/接口,所以将为您创建基于CGLIB的代理。
现在的问题是,这个代理将被注入到所有类中,这就是为什么你只看到1个实例(代理本质上),代理知道如何管理范围 - 只要当你浏览你的类的方法时,如果你通过getter和setter调用来获取User类的属性,你应该看到适合于会话的值。