cdx*_*dxf 4 spring dependency-injection spring-mvc spring-ioc spring-boot
Count.java:
@Component
@Scope(value = "session",proxyMode = ScopedProxyMode.TARGET_CLASS)
public class Count {
Integer i;
public Count() {
this.i = 0;
}
Run Code Online (Sandbox Code Playgroud)
控制器:
@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";
}
}
Run Code Online (Sandbox Code Playgroud)
但每次我运行这个控制器(/问候语),它甚至在我关闭浏览器时总是增加i,所以如何在Singleton Controller中使用这个Session Scoped Component?
代理只拦截方法调用.在您的情况下会发生以下情况:
@Autowired private Count count;
Run Code Online (Sandbox Code Playgroud)
创建一个看起来像count实例的代理,因此也有一个i字段.但由于代理不是真实的,因此Count构造函数不会被调用并i保持未初始化状态.这就是你总能得到的原因null.
现在让我们介绍一个getter:
class Count {
...
public Integer getI() {
return i;
}
Run Code Online (Sandbox Code Playgroud)
当您调用getI()代理时,首先检查是否存在Count当前会话的bean 实例.如果没有,则创建一个.这也意味着Count构造函数被调用并且i现在已经初始化.然后代理将调用委托给getI()将返回值的bean i.
| 归档时间: |
|
| 查看次数: |
5370 次 |
| 最近记录: |