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