【问题标题】:How to use Session Scoped Component in Controller如何在 Controller 中使用 Session Scoped 组件
【发布时间】:2016-09-14 19:56:26
【问题描述】:

Count.java:

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

控制器:

@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";
    }
}

但是每次我运行这个控制器(/greeting),即使我关闭浏览器,它总是增加 i,那么我如何在单例控制器中使用这个 Session Scoped Component?

【问题讨论】:

  • Spring request scope bean的可能重复
  • i创建一个getter。
  • @zeroflagL:它有效,谢谢。但是你能解释一下吗。起初,会话 bean 就像一个全局变量,即使我删除了 cookie,它也会增加。但是使用 setter/getter 代替 i++;它就像一个魅力

标签: spring spring-mvc dependency-injection spring-boot spring-ioc


【解决方案1】:

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

@Autowired private Count count;

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

现在让我们介绍一个 getter:

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

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

【讨论】:

  • 您的回答者还解释了什么是代理以及它是如何工作的:D
猜你喜欢
  • 2014-01-04
  • 1970-01-01
  • 2013-11-02
  • 2020-07-13
  • 1970-01-01
  • 2012-04-09
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多