【发布时间】:2013-09-18 14:37:20
【问题描述】:
Grails 控制器的默认范围是prototype,即将为每个请求创建一个新控制器(建议作为闭包属性的操作)
控制器支持另外两个范围:
session - 为用户会话的范围创建一个控制器
singleton - 只存在一个控制器实例(推荐作为方法的操作)
什么时候应该使用哪个范围?我什么时候可以做出改变范围的决定?在什么情况下?
【问题讨论】:
Grails 控制器的默认范围是prototype,即将为每个请求创建一个新控制器(建议作为闭包属性的操作)
控制器支持另外两个范围:
session - 为用户会话的范围创建一个控制器
singleton - 只存在一个控制器实例(推荐作为方法的操作)
什么时候应该使用哪个范围?我什么时候可以做出改变范围的决定?在什么情况下?
【问题讨论】:
Prototype 和session 范围意味着您可以在控制器字段中存储请求/会话特定状态。但是,这不是推荐的做法,应该避免。
如果您遵循常规做法并避免控制器中的状态,您可以轻松地使用singleton 范围(这是 Spring Web MVC 控制器中的默认值)。
如果您的控制器中有状态,则必须使用 prototype 或 session 范围。
一般来说,我建议不要为控制器混合不同的范围。如果您不小心将有状态字段添加到单例控制器中,这可能是一个非常痛苦的经历,因为您习惯了prototype 范围。在多个并发请求/会话访问同一字段并且一切都中断之前,您不会注意到此错误。
【讨论】: