弹簧 MVC 控制器是单例吗?

2022-08-31 16:43:52

我有一个关于春季3 MVC的疑问。当请求传入时,容器是为每个请求创建控制器的新实例(类似于 Struts 2 - ThreadLocal 中的操作),还是单个实例响应所有请求?默认情况下,控制器 Bean 在上下文中是单例吗?@ControllersActionContext

Spring 3 MVC 应用程序的指南/最佳实践是什么?这些设置是否可配置?是否应配置这些内容?如果我的环境是集群环境,它是否会有太大变化 - 我想它不应该因为jvm/容器会有所不同 - 但欢迎一些权威的建议。

我读过Spring文档,但可能我错过了它。任何“这就是我们实现的方式”的答案/指针/链接都会有所帮助 谢谢。


答案 1

弹簧控制器是单例(每个Web应用程序的每个控制器只有一个实例),就像servlet一样。通常,改变这种行为是没有意义的(如果可能的话)。请参阅关于 servlet 的螺纹安全性,了解常见的陷阱,也适用于控制器。

如果应用程序是群集的,请尽可能多地避免出现状态。控制器中的状态将需要同步以避免线程问题。此外,您可能会在服务器之间复制该状态 - 非常昂贵且麻烦。


答案 2

默认情况下,春豆是单例。Spring建议对控制器和DAO等无状态bean使用单例,对有状态bean使用原型范围。


推荐