我有一个用户类:
@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";
}
}
我使 session 无效,以便下次访问/users 时,我会得到另一个用户。由于用户的 session 范围,我期待一个不同的用户,但我得到了同一个用户。我在 Debug模式下检查过,它在内存中是相同的对象 ID。我的 bean 是这样声明的:
<bean id="user" class="org.synchronica.domain.User">
<aop:scoped-proxy/>
</bean>
我是 Spring 的新手,所以我显然做错了什么。我希望每个 session 都有一个 User 实例。怎么办?
最佳答案
这是预期的行为。当你用 <aop:scoped-proxy/>
标记一个 bean 时为它创建了一个代理。如果该 bean 有一个接口(interface),则会创建一个 java 动态代理,否则会创建一个基于 CGLIB 的代理 - 在您的情况下,因为您的 User 类没有父类/接口(interface),将为您创建一个基于 CGLIB 的代理。
现在要注意的是这个代理将被注入(inject)到你所有的类中,这就是为什么你只看到 1 个实例(本质上是代理的)的原因,代理知道如何管理范围 - 只要当你通过你的类的方法时,所以在你的情况下,如果你通过 getter 和 setter 调用来获取你的 User 类的属性,你应该看到反射(reflect) session 的适当值。
关于java - session 范围的 bean 作为 Spring MVC Controller 的类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13533038/