如何在控制器中使用会话作用域组件



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

但是,每次我运行这个控制器(/holding(,即使我关闭浏览器,它也总是会增加i,那么我如何在Singleton控制器中使用这个会话范围组件呢?

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

@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的值。

最新更新