我对 Spring 3 MVC @Controllers
有疑问。当请求进入时,容器是否为每个请求创建一个新的控制器实例(类似于Struts 2中的 Action - ThreadLocal ActionContext
)或单个实例响应所有请求?默认情况下是上下文中的控制器bean单例吗?
Spring 3 MVC应用程序的指南/最佳实践是什么?这些设置是否可配置?应该配置? 如果我的环境是一个集群环境,它会有多大变化 - 我想它不应该因为jvm /容器会有所不同 - 但是一些权威的建议会受到欢迎。
我已阅读过Spring文档,但可能我错过了它。任何'这就是我们如何实现'答案/指针/链接将有所帮助 感谢。
答案 0 :(得分:48)
Spring控制器是单例(每个Web应用程序只有一个控制器实例),就像servlet一样。通常,改变这种行为是没有意义的(如果可能的话)。有关常见陷阱,请参阅Regarding thread safety of servlet,同时适用于控制器。
如果您的应用程序是群集的,请尽可能多地避免状态。控制器中的状态将需要同步以避免线程问题。此外,您可能会跨服务器复制该状态 - 非常昂贵且麻烦。
答案 1 :(得分:3)
默认情况下,Spring bean是单例。 Spring建议将单例用于无状态bean,如控制器和DAO,以及有状态bean的原型范围。
答案 2 :(得分:2)
Struts2动作不是单例,因为它们带有状态。 Struts2利用动作本身的javabeans属性来携带传入的请求数据并将其暴露给框架的各个层。
另一方面,Spring使用传递给控制器的模型对象。控制器本身不保持状态,因此单例是有意义的。答案 3 :(得分:2)
控制器是单例,因此如果webapp同时处理大量请求,则可以避免通过关键字new创建大量实例。使用控制器单例也可以通过减少年轻GC来减轻JVM的负担。