【问题标题】:Spring singleton bean春季单例豆
【发布时间】:2014-12-13 16:09:17
【问题描述】:

我知道这个问题可能听起来很幼稚,但我对 bean 在 Web 应用程序中的范围感到困惑。 我知道对于每个请求,容器都会产生一个新线程,类似地,在 Spring Web 应用程序的情况下,每个请求都会产生一个新线程,那么为什么建议将我的控制器、服务定义为单例,不应该是范围这些 bean 中的一部分是原型,因为每个请求(即线程)都有自己的控制器实例,服务可以使用。

请赐教。

【问题讨论】:

标签: java multithreading spring


【解决方案1】:

这将是一个巨大的开销。如果您使代码正确地线程安全,则没有理由每个请求都需要自己的服务 bean,这通常意味着不在 bean 上保留任何每个请求的状态。

【讨论】:

  • 对象实例化速度很快。实例化合理的服务或控制器的开销通常不是性能问题,并且线程安全问题较少。特别是对于服务来说,没有理由拥有多个副本(通常),对于控制器来说,参数并不那么明确。
  • @DaveNewton 实例化很快。接线不是。
【解决方案2】:

即使创建了一个新线程(或根据配置重复使用),控制器和服务实例也会重复使用。如果控制器和服务设计得好,它们就请求而言可以是无状态的并且是不可变的,这将使它们成为线程安全的。当对象的状态在创建后不会改变时,这也会导致对象创建的数量少得多。

【讨论】:

    【解决方案3】:

    https://gottalovedev.wordpress.com/2014/11/23/bean-scope/

    读一读。我相信它会有所帮助。

    【讨论】:

    • 感谢您提供链接,它回答了我的问题。
    • 不客气!!如果您对 spring/java 中的任何其他主题有疑问,请提出请求,我会就该主题写一篇文章。
    【解决方案4】:

    我认为这真的取决于您是否需要在 bean 中存储任何状态。通常,我编写我的单例,以便它们内部不包含任何状态,并且仅用于计算业务逻辑。如果不需要管理状态,那么让所有线程共享一个单例实例是可以接受的。

    【讨论】:

      猜你喜欢
      • 2017-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-22
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多