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

时间:2012-11-23 16:47:44

标签: java spring scope

我有一个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实例。怎么样?

1 个答案:

答案 0 :(得分:3)

这是预期的行为。使用<aop:scoped-proxy/>标记bean时,会为其创建代理。如果存在bean的接口,则创建java动态代理,否则创建基于CGLIB的代理 - 在您的情况下,因为您的User类没有父类/接口,所以将为您创建基于CGLIB的代理。

现在的问题是,这个代理将被注入到所有类中,这就是为什么你只看到1个实例(代理本质上),代理知道如何管理范围 - 只要当你浏览你的类的方法时,如果你通过getter和setter调用来获取User类的属性,你应该看到适合于会话的值。