Spring单例bean

5
我知道这个问题可能听起来很幼稚,但我对web应用程序中bean的范围有些困惑。我知道对于每个请求,容器都会生成一个新的线程,同样地,在spring web应用程序的情况下,每个请求都会生成一个新的线程。那么为什么建议将我的控制器、服务定义为单例?难道这些bean的作用域不应该是原型吗?因为每个请求即线程都将拥有自己的控制器、服务实例来处理。
请给我启示。

我想你应该检查一下请求范围和原型范围之间的区别。https://dev59.com/H2w15IYBdhLWcg3wpNYB - Sanghyun Lee
4个回答

6

这将会增加很大的开销。如果您正确地使代码线程安全,通常意味着不在bean上保留每个请求的状态,那么每个请求都不需要自己的服务bean。


对象实例化很快。实例化合理的服务或控制器的开销通常不是性能问题,并且线程安全问题较少。对于服务而言,通常没有多个副本的理由,对于控制器而言,参数并不那么明确。 - Dave Newton
3
实例化很快。但连线不是。 - chrylis -cautiouslyoptimistic-

3
尽管创建了一个新的线程(或根据配置重用线程),控制器和服务实例将被重用。如果控制器和服务设计得好,它们可以在请求方面是无状态且不可变的,这将使它们线程安全。这也会导致更少的对象创建,因为它们的状态在创建后不会改变。

1

感谢您提供链接,它回答了我的问题。 - Apollo
不用客气!!如果您还有任何关于Spring/Java的疑问,请提出请求,我会写一篇关于那个主题的文章。 - Pratik

0

我认为这取决于您是否需要在bean中存储任何状态。通常,我编写单例时会确保其内部不包含任何状态,仅用于计算业务逻辑。如果不需要管理状态,则可以让所有线程共享该单例实例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接