2014-12-13 119 views
5

我知道这个问题听起来很天真,但我对Web应用程序中bean的范围有困惑。 我知道,对于每一个请求,一个新的线程是由容器产生的类似的情况下弹簧web应用程序为每个请求产生一个新的线程,那么为什么建议将我的控制器,服务定义为单例,不应该这些bean的作用域是原型,因为每个请求即线程都会有自己的控制器实例,服务要与之协同工作。春天的单身豆

请赐教。

+0

而且,我想你应该检查请求和原型范围之间的区别http://stackoverflow.com/questions/6480005/spring-request-and-prototype-scope – 2014-12-13 16:33:49

回答

1

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

给这个一读。我相信这会有所帮助。

+0

感谢您提供链接,它回答了我的问题。 – Apollo 2014-12-13 18:14:50

+0

不客气!如果您对spring/java中的任何其他主题有疑问,请发出请求,我将在该主题上写一篇文章。 – Pratik 2014-12-13 18:25:13

+0

似乎您的链接已损坏... – coderz 2015-05-10 08:14:26

6

这将是一个巨大的开销。没有理由为什么每个请求都需要它自己的服务bean,如果你让你的代码正确的线程安全,这通常意味着不保留bean上的每个请求状态。

+0

对象实例化很快。实例化合理服务或控制器的开销通常不是性能问题,并且线程安全问题较少。特别是对于服务来说,没有理由*有多个副本(一般情况下),对于控制器来说,参数不是那么明确。 – 2014-12-13 16:18:33

+3

@DaveNewton实例化速度很快。布线不是。 – chrylis 2014-12-13 16:27:36

3

即使创建了新线程(或根据配置重新使用),控制器和服务实例也被重新使用。如果控制器和服务设计得很好,它们可以在请求和不可变的情况下是无状态的,这将使它们成为线程安全的。当它们的状态在创建之后不会改变时,它也会导致更少的对象创建。

0

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