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