【发布时间】:2015-05-19 12:57:08
【问题描述】:
对于控制器中引用的某些 bean 的范围,我遇到了一些概念上的困难。我已经检查了很多文件中的相关问题,但仍然不确定。有人可以帮我澄清一下吗?
我将问题或陈述编号如下,以便帮助者更容易解决我的问题。
根据我对 Spring Web 应用程序中 Spring doc, 的理解,
1) 对于任何带有@Controller 注释的控制器,如果有一个私有字段bean,具有默认bean 范围,该字段bean 将作为单例访问,因此容易受到线程问题的影响;
2) 如果字段 bean 被标记为 scope=""prototype,则此控制器中的该字段 bean 仍将表现得像一个单例,因此不是线程安全的。
3) 为了使这样的字段 bean 线程安全,我们必须使 bean 的作用域为 request 或 session 对吧?
以下是与此问题相关的简化示例:
@Controller public Class ControllerA
@Autowired private DefinedBean db;
@RequestMapping("/testPath") public ModelAndView getPathPage(){
this.db.setTitle("abc");
this.db.readReportWithTitle();
....
return new ModelAndView();
}
所以在这个例子中,
4) 如果DefinedBean 是通过xml 配置定义的,有或没有prototype 的显式范围,这个DefinedBean 会有同步问题,对吧?
5) 为确保该DefinedBean 是线程安全的,我们必须使用request 或Session 显式定义它。
另一方面,
6) 如果我们明确地用prototype 的范围标记控制器本身,它会摆脱DefinedBean 字段的非线程安全问题吗?我的想法是不,这不会。
7)为了使字段线程安全,如果我们要在控制器级别进行控制,我们还需要将控制器标记为Scope="Request",对吗?
欢迎并感谢您的 cmets。如果您可以用“正确”或“不正确”评论或进一步详细说明那些编号(1~7)的陈述,我自己和可能后来的人会更加感激。
【问题讨论】:
标签: spring controller scope thread-safety javabeans