2012-08-27 35 views
2

我有这个新的mvc项目,其中所有的bean都是默认的作用域(没有原型或会话)。带有单个应用程序上下文的 。spring mvc声明所有bean单身

我想知道 通过使所有的bean被默认作用域是我们试图实现整个应用程序在单线程中运行?

如果是这样会使每个httprequest(从多个或相同的会话)排队,直到前一个完成?如何避免这种情况下任何建议或链接将有所帮助。

我对spring和java开发比较陌生。

+2

我不觉得你的HttpRequest会排队等待以前的完成。请更多地阅读spring文档。所有你的问题都已经在那里回答了:-) – Arun

回答

8

因为Spring bean通常是无状态的,所以可以安全地从多个线程调用它们。这就是你的应用程序的工作方式:每个控制器,服务,DAO只有一个实例,但是你的servlet容器(通过Spring)从多个线程调用这些bean - 并且它完全是线程安全的。

事实上,在普通的servlet中,情况是相同的 - 每个servlet只有一个实例,可以通过无限数量的线程访问。只要这个servlet是无状态的或正确同步的。

不要将Spring与无状态会话Bean混淆在中,并且每个客户端都从池中获取它自己的实例。

1 - 其实这是一个有点哑 - 因为豆类由定义无状态的,有在汇集和防止并发访问没有点...

+0

与你关于EJB规范的评论相关:为什么需要合并?有些Java EE部件在抛出异常后不能保证工作(例如[Hibernate/JPA中的异常处理](http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html /ch13.html#transactions-demarcation-exceptions))。鉴于此,容器应该1.重新注入bean中的失败组件(例如,在EJB实例中重新注入'EntityManager')2.或者简单地扔掉bean并创建另一个。第二种解决方案被选中。 Spring如何处理这种情况? –

+0

我相信这是一个常见的错误,对于Spring bean也有很大的不同。从客户的角度来看,无状态EJB意味着无状态,这意味着哪个bean服务于客户请求并不重要。另一方面,这些bean可以拥有广泛创建的资源或其他内部状态。因此,合并可以提供性能优势以及线程安全性。 – Kousalik

0

单例表示每个bean只有一个实例。一般来说,这些豆类是不含任何​​状态的处理元素。在它们上面调用的方法被传递给包含要处理的输入的上下文。因此,调用这种单例bean的方法本质上是线程安全的。