Grails如何使'params'可用于单例控制器?(Grails内部)

Grails如何使'params'可用于单例控制器?(Grails内部),grails,groovy,singleton,metaprogramming,Grails,Groovy,Singleton,Metaprogramming,如果我通过以下方式使Grails控制器成为单例: static scope = "singleton" 。。。Grails如何将params变量公开给控制器的操作,其中params是特定于请求的 如果params作为一个变量传递到我的操作方法中,我会理解,但是这里params只是可用的,并且在范围内(对于同时的请求来说是不同的,尽管我的控制器只有一个实例) 这是如何在后台实现的?每个请求都有自己的线程,因此请求、响应、参数、会话等都是可用的,与控制器是单例还是为每个请求创建新的无关。如果这些变

如果我通过以下方式使Grails控制器成为单例:

static scope = "singleton"
。。。Grails如何将
params
变量公开给控制器的操作,其中
params
是特定于请求的

如果
params
作为一个变量传递到我的操作方法中,我会理解,但是这里
params
只是可用的,并且在范围内(对于同时的请求来说是不同的,尽管我的控制器只有一个实例)


这是如何在后台实现的?

每个请求都有自己的线程,因此请求、响应、参数、会话等都是可用的,与控制器是单例还是为每个请求创建新的无关。如果这些变量是类中的字段,则会有所不同,但它们不是


这是通过AST转换实现的,AST转换将
org.codehaus.groovy.grails.plugins.web.api.ControllersApi
混合到控制器类中,该类添加了
getParams()
(可以将其用作
params
属性)等方法。这些调用
RequestContextHolder.currentRequestAttributes()
以获取线程本地信息。

Burt,因此如果我们有一个具有4个方法的单例作用域控制器,假设其中一个方法将文件上载到单例服务并返回上载文件的名称,如果多个并发用户同时访问此控制器操作,这应该是安全的,对吗?实例是否为单实例没有关系-只要实例没有共享的可变状态,或者至少您调用的方法不访问可变状态(读或写),这样就不会出现并发问题。您的意思是,如果我用一个方法(例如def uploadPhoto())将文件写入磁盘,那么多个用户调用该方法可能会导致问题?很抱歉,我有点困惑:(当你输入一个方法时,你会得到你自己的局部变量副本。只要你不访问任何共享的东西,一切都很好。如果你写一个文件,只要文件名是唯一的,就不应该有问题。明白了:)谢谢Burt,你的评论非常有用。