Java SpringMVC声明所有bean为单例

Java SpringMVC声明所有bean为单例,java,spring,model-view-controller,ejb,Java,Spring,Model View Controller,Ejb,我有一个新的mvc项目,其中所有bean都是默认范围的(没有原型或会话)。 使用单个应用程序上下文 我想知道 通过将所有bean设置为默认作用域,我们是否试图实现在单个线程中运行整个应用程序 如果是这样的话,这会使每个httprequest(来自多个或同一个会话)排队,直到前一个会话完成吗?如何避免这种情况任何建议或链接都会很有帮助 我对spring和java开发比较陌生。Singleton意味着每个bean只有一个实例。通常,这样的bean是不携带状态的处理元素。对它们调用的方法被传递给包含要

我有一个新的mvc项目,其中所有bean都是默认范围的(没有原型或会话)。 使用单个应用程序上下文

我想知道 通过将所有bean设置为默认作用域,我们是否试图实现在单个线程中运行整个应用程序

如果是这样的话,这会使每个httprequest(来自多个或同一个会话)排队,直到前一个会话完成吗?如何避免这种情况任何建议或链接都会很有帮助


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

Singleton意味着每个bean只有一个实例。通常,这样的bean是不携带状态的处理元素。对它们调用的方法被传递给包含要处理的输入的上下文。因此,对此类单例bean的方法调用本质上是线程安全的。

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

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

不要将Spring与无状态会话bean混淆,因为它们是池化的,并且每个客户机都从池中获取自己的实例。1


1-事实上,这有点愚蠢-因为根据定义,bean是无状态的,所以没有必要将它们集中起来并阻止并发访问…

我认为您的httprequest不会排队等待以前的请求完成。请详细阅读spring文档。您的所有问题都已经在这里得到了回答:-)与您对EJB规范的评论有关:为什么需要池?有一些JavaEE部件在抛出异常后不能保证工作(例如)。鉴于此,容器应为1。要么在bean中重新注入失败的组件(例如在EJB实例中重新注入
EntityManager
)。或者干脆把豆子扔掉,再做一个。选择了第二种解决方案。这个病例在春天是如何处理的?我相信这是一个常见的错误,对春豆来说也是一个很大的区别。从客户机的角度来看,无状态EJB是无状态的,这意味着哪个bean服务于客户机请求并不重要。另一方面,这些bean可以保存可扩展的资源或其他内部状态。因此,池提供了性能优势和线程安全。