是Spring MVC控制器单身人士吗?

Atu*_*tul 46 java spring spring-mvc

我对Spring 3 MVC有疑问 @Controllers.当请求进来时,容器是否为每个请求创建一个新的控制器实例(类似于Struts 2中的Action - ThreadLocal ActionContext)或单个实例响应所有请求?默认情况下,上下文中的控制器bean单例?

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

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

Tom*_*icz 51

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

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

  • 请注意,它们只是每个上下文的单例,并且在使用Spring Web应用程序时完全可以使用嵌套上下文,并且通过复制包扫描,您最终可能会得到同一个控制器的多个实例. (9认同)

Ram*_*ams 5

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