如果我通过使Grails控制器成为单例控制器
static scope = "singleton"
Grails如何将params
变量公开给我的控制器的操作,其中params
是特定于请求的?
如果params
作为一个变量被传递到我的操作方法中,我会理解,但这里params
只是可用的,并且在作用域中(对于同时请求是不同的,尽管我的控制器只有一个实例)。
这是如何在幕后实现的
每个请求都有自己的线程,因此请求、响应、参数、会话等都是可用的,而与控制器是单例还是为每个请求创建新的无关。如果这些变量是类中的字段,情况会有所不同,但它们不是。
在后台,这是通过将org.codehaus.groovy.grails.plugins.web.api.ControllersApi
中的AST转换混合到控制器类中来实现的,该转换添加了getParams()
(可以用作params
属性)等方法。这些调用RequestContextHolder.currentRequestAttributes()
来获取线程本地信息。