5

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

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

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

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

4

2 回答 2

11

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

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

不要将 Spring 与中池化的无状态会话 bean 混淆,每个客户端都从池中获取自己的实例。1

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

于 2012-08-27T18:22:45.843 回答
2

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

于 2012-08-27T18:22:39.933 回答