Spring MVC控制器是单身吗?

我有一个关于Spring 3 MVC @Controllers的查询。 当一个请求到来时,容器是否为每个请求创build一个新的控制器实例(类似于Struts 2中的Action – ThreadLocal ActionContext ),还是一个实例会响应所有请求? 默认情况下是在一个上下文中的控制器单身人士?

Spring 3 MVC应用程序的准则/最佳实践是什么? 这些设置是可configuration的吗? 应该configuration吗? 如果我的环境是一个集群环境,它是否会发生很大的变化 – 我想不应该像jvm / containers会有所不同 – 但是一些权威性的build议是值得欢迎的。

我读过Spring文档,但可能是我错过了。 任何'这是我们如何实现'的答案/指针/链接将是有益的谢谢。

Spring控制器是单例(每个Web应用程序只有一个控制器的实例)就像servlet一样。 通常情况下,改变这种行为没有意义(如果甚至可能的话)。 请参阅关于servlet的常见错误的线程安全性 ,也适用于控制器。

如果您的应用程序是群集尽可能避免状态。 控制器中的状态将需要同步以避免线程问题。 你也可能在服务器上复制这个状态 – 非常昂贵和麻烦。

Struts2行动不是单身人士,因为他们携带状态。 Struts2利用动作本身的javabeans属性来传入请求数据,并将其暴露给框架的各个层次。

另一方面,Spring使用交给控制器的模型对象。 控制器本身不保持状态,所以单身人士是有道理的。

Controller是单例,因此如果webapp同时处理很多请求,可以避免通过关键字new创build大量实例。使用控制器singleton还可以通过减less年轻的GC来减轻JVM的负担。