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

标签 java spring scope

我有一个用户类:

@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/

相关文章:

java - 如何将 Jython 文件导入 Groovy?

java - Spring 中使用的 XML Schema URL 是从什么时候开始仅支持 TLS1.2 的?

java - 使用 PropertyOverrrideConfigurer 覆盖 bean 引用

javascript - 如何限制 javascript/jquery 中函数的范围

java - "submethod"中的局部变量

java - 通过使用循环访问每个索引将字符串数组转换为整数数组

Java 等于父类(super class)和子类

java - 使用单个字符串变量在 @Requestparam 中传递多个键

java - hibernate 子查询抛出空指针异常

AngularJS 和 Angular-UI Bootstrap 选项卡作用域