2013-08-28 3 views
4

Если я делаю Grails контроллер одноэлементно через:Как Grails делает `params` доступным для контроллера Singleton? (Grails Внутренности)

static scope = "singleton" 

... как же Grails выставить params переменную на действия моего контроллера, где params являются запрос конкретнее?

Я бы понял, были ли переданы params моими методами действия в качестве переменной, но здесь params доступны и доступны в разных областях (и разные для одновременных запросов, несмотря на то, что есть только один экземпляр моего контроллера).

Как это реализовано под капотом?

ответ

8

Каждый запрос получает свой собственный поток, поэтому запрос, ответ, параметры, сеанс и т. Д. Доступны независимо от того, является ли контроллер одиночным или создан новым для каждого запроса. Было бы иначе, если бы эти переменные были полями в классе, но это не так.

Под капотом это реализуется с помощью AST преобразования, который смешивает в org.codehaus.groovy.grails.plugins.web.api.ControllersApi в классы контроллеров, который добавляет методы, такие как getParams() (которые вы можете использовать в качестве params собственности). Они вызывают RequestContextHolder.currentRequestAttributes(), чтобы получить информацию о потоке.

+0

Идеально подходит к делу - спасибо! – Bosh

+0

Burt, поэтому, если у нас есть контроллер с одним ядром с 4 методами, скажем, один из методов загружает файл в однопользовательскую службу и возвращает имя загруженного файла, если несколько одновременных пользователей одновременно получают доступ к этому действию контроллера, это должно быть безопасно, я прав? – AlexCon

+0

Являются ли экземпляры одиночными или нет, не имеют никакого отношения - если экземпляры не имеют общего измененного состояния или, как минимум, методы, которые вы вызываете, не имеют доступа к изменяемому состоянию (чтение или запись), тогда не будет проблем с параллелизмом , –

Смежные вопросы