2011-10-29 43 views
0

春天的豆有两种类型的作用域(如果你不考虑网络的范围):singleton,这是默认和prototype。他们大致在上下文中实现单例和原型设计模式。春天的无状态和有状态豆的模拟

因此,如果bean具有原型范围,它可以像EJB中的有状态bean一样拥有唯一的状态。当bean的范围是单例时,容器将只创建它的一个实例。所以我们可以说EJB 3.1中的单例bean是春季单例bean的类比。

但是我如何能够在Spring中获得无状态bean的功能(我指的是在EJB容器中合并无状态bean并且每个线程都有一个无状态bean的唯一实例)?

+0

请注意,线程具有唯一实例并不是真的。如果一个线程在同一个bean之后进行多次调用,则每个调用可能会在另一个实例中结束。相反,这是相反的。一次只能有一个线程在无状态会话bean中处于活动状态,并且框架自动将不同的请求路由到不同的实例。 –

+0

谢谢,我的意思是,你只是在谈论 – maks

回答

2

要么你可以使bean线程安全,并且单例bean是可以的(这是大多数情况)。或者你不能,你将不得不使用原型。我在Spring原型bean和无状态EJB会话bean之间看到的差异是无状态会话bean被合并。但在这些年代里,每次汇集它们或创建一个新实例都没有太大的区别。每次创建一个新实例甚至可以帮助GC。

+2

池还通过将池设置为适当的大小来帮助自动资源调节。此外,bean实例*可能很便宜,但其关联资源可能不是。另外,通过使用代理+池模式,注入许多'豆'变得非常便宜,即使最终不被使用也不会有问题。由于无状态bean的代理与指向池的URL类似。 –