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"; } }
但是,每当我运行此控制器(/打招呼)时,即使关闭浏览器,它也始终会增加i,那么如何在Singleton Controller中使用此会话范围组件?
代理仅拦截方法调用。在您的情况下,会发生以下情况:
@Autowired private Count count;
创建一个看起来像count实例的代理,因此也有一个i字段。但是由于代理不是真实的东西,因此Count不会调用构造函数,并且该构造函数i仍未初始化。这就是为什么你总是得到null。
i
Count
null
现在让我们介绍一个吸气剂:
class Count { ... public Integer getI() { return i; }
调用getI()代理时,首先检查Count当前会话是否有Bean 的实例。如果没有,则创建一个。这也意味着将Count调用构造函数,并且i现在将其初始化。然后,代理将调用委托给getI()将返回值的Bean i。
getI()