春天的单身豆

时间:2014-12-13 16:09:17

标签: java multithreading spring

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

请赐教。

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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