【问题标题】:Spring web app controller field scopeSpring Web 应用程序控制器字段范围
【发布时间】:2015-05-19 12:57:08
【问题描述】:

对于控制器中引用的某些 bean 的范围,我遇到了一些概念上的困难。我已经检查了很多文件中的相关问题,但仍然不确定。有人可以帮我澄清一下吗?

我将问题或陈述编号如下,以便帮助者更容易解决我的问题。

根据我对 Spring Web 应用程序中 Spring doc, 的理解,

1) 对于任何带有@Controller 注释的控制器,如果有一个私有字段bean,具有默认bean 范围,该字段bean 将作为单例访问,因此容易受到线程问题的影响;

2) 如果字段 bean 被标记为 scope=""prototype,则此控制器中的该字段 bean 仍将表现得像一个单例,因此不是线程安全的。

3) 为了使这样的字段 bean 线程安全,我们必须使 bean 的作用域为 requestsession 对吧?

以下是与此问题相关的简化示例:

@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 是线程安全的,我们必须使用requestSession 显式定义它。

另一方面,

6) 如果我们明确地用prototype 的范围标记控制器本身,它会摆脱DefinedBean 字段的非线程安全问题吗?我的想法是不,这不会。

7)为了使字段线程安全,如果我们要在控制器级别进行控制,我们还需要将控制器标记为Scope="Request",对吗?

欢迎并感谢您的 cmets。如果您可以用“正确”或“不正确”评论或进一步详细说明那些编号(1~7)的陈述,我自己和可能后来的人会更加感激。

【问题讨论】:

    标签: spring controller scope thread-safety javabeans


    【解决方案1】:

    我认为您想让控制器保持单身。
    Here 是解释如何绑定具有不同范围的 bean 的 spring 文档。

    这就是您想要定义有线 bean 的方式:

    <bean id="db" class="DefinedBean" scope="request">
      <aop:scoped-proxy/>
    </bean>
    

    我查看了如何仅使用注释来完成相同的操作,我找到了this

    基本上,您使用以下注释来注释 DefinedBean:

    @Scope(value = "session", proxyMode = ScopedProxyMode.INTERFACES)
    

    【讨论】:

      猜你喜欢
      • 2013-09-03
      • 1970-01-01
      • 1970-01-01
      • 2016-08-29
      • 2020-03-22
      • 2011-08-01
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多