gpt4 book ai didi

spring - 如何在 Controller 中使用 session 范围组件

转载 作者:行者123 更新时间:2023-12-02 08:50:00 25 4
gpt4 key购买 nike

Count.java:

@Component
@Scope(value = "session",proxyMode = ScopedProxyMode.TARGET_CLASS)
public class Count {
Integer i;
public Count() {
this.i = 0;
}

Controller :

@Controller
public class GreetingController {
@Autowired private Count count;
@RequestMapping("/greeting")
public String greetingForm(Model model) {
if(count.i == null) i == 0;
else i++;
model.addAttribute("count",String.valueOf(count.i));
return "greeting";
}
}

但是每次我运行这个 Controller (/greeting),即使我关闭浏览器,它总是会增加 i,那么我如何在单例 Controller 中使用这个 session 范围组件?

最佳答案

代理仅拦截方法调用。在您的情况下,会发生以下情况:

@Autowired private Count count;

创建一个看起来像 count 实例的代理,因此也有一个 i 字段。但由于代理不是真实的,因此不会调用 Count 构造函数,并且 i 保持未初始化状态。这就是为什么你总是得到 null

现在让我们介绍一个 setter/getter :

class Count {
...
public Integer getI() {
return i;
}

当您调用getI()时,代理首先检查当前 session 是否存在Count bean的实例。如果没有,则创建一个。这也意味着 Count 构造函数被调用,并且 i 现在已初始化。然后,代理将调用委托(delegate)给 bean 的 getI(),该调用将返回 i 的值。

关于spring - 如何在 Controller 中使用 session 范围组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39488124/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com