2013-09-18 1 views
0

В соответствии с documentation контроллер Grails - это просто класс с «Контроллером», добавленным к имени и сохраненным в grails-app/controllers/. Простейшие такого класса существ:Откуда берутся методы «expando» контроллера Grails?

package some.package 

class FooController { 
    def index = {} 
} 

Когда приложение Grails запущенно, этот контроллер будет наследовать некоторые стандартные методы, такие как getParams и getSession. На прилагаемом скриншоте я вижу, что они добавлены через groovy.lang.ExpandoMetaClass. Я не вижу, как это происходит. Контроллер не реализует никаких интерфейсов или не расширяет любые абстракции. Откуда берутся эти методы?

Controller object graph

+3

Добавление методов и свойств может быть выполнено через Groovy runtime и метапрограммирование времени компиляции. Grails использует эту тактику, чтобы совершить «волшебство». Он изменяет все контроллеры по соглашению. Вы спрашиваете, где именно работает этот код? –

+1

Это как просить, откуда происходят радуги. Они просто такие потрясающие, кого это волнует! – Gregg

+0

@JamesKleeh, если это единственный ответ, да. Мне не нравится не знать, где искать ответ, когда у меня возникает вопрос о чем-то. В этом случае, где я буду смотреть, чтобы узнать обо всех «унаследованных» методах, доступных контроллеру, и что они делают? На данный момент я должен установить точку останова, выровнять график и затем угадать. –

ответ

5

От Grails 2.0 новая методика была адаптирована для добавления динамических методов к артефактам контроллера. Вы можете посетить их шаг мудрыми, чтобы увидеть, как эти свойства будут добавлены контроллеры: -

  • контроллера в Грааль не является частью Grails-ядро, но плагин самого по себе в Грааль имени grails-plugin-controllers.
  • Будучи плагином, соответствующий класс *GrailsPlugin определяет поведение плагина.
  • ControllersApi (расширение CommonWebApi) несет все те свойства, которые необходимо добавить к артефакту контроллера. (Представлено Grails 2.0)
  • ControllerGrailsPlugin регистры КонтроллерыАпи как spring bean.
  • Существует еще одно добавление ControllerApi в качестве компонента.
  • Существует концепция MetaClassEnhancer, которая возьмет/рассмотрит API (в данном случае ControllerApi) и улучшит/совместит артефакт (контроллер) с соответствующим API, добавив CachedMethods в артефакт, используя отражение, которое является ролью BaseApiProvider присутствует в grails-core.
  • Этот magic happens in the Controller plugin class также.

Теперь, до Grails 2.0, был добавлен другой способ добавления динамических свойств к контроллеру. Таким образом, свойства metaClass были добавлены в контроллеры во время выполнения, что оказалось менее эффективным. Каждое из динамических свойств было представлено собственным классом (а именно: GetParamsDynamicProperty, GetSessionDynamicProperty), который сейчас не используется.

Так что вам нужно посмотреть в дереве объектов для этих динамических методов: this, где CachedMethods доступны в контроллере. Надеюсь, это поможет. Я был бы рад добавить больше, если вы будете искать больше.:-)

+0

Ух, такой беспорядок. Это очищает меня. Спасибо. –

+0

Я бы не рассматривал это как беспорядок, потому что способ, которым этот плагин адаптирован, отражает тонкомасштабный подход с использованием преобразований AST и, как сказано ранее, MetaClassEnhancer. Как автор, у вас будет полный контроль над каркасом при подключении бусинок. :-) @jsumners – dmahapatro

0

Цитируя замечательной книги Берта Беквит, в Programming Grails:

Более 30 методов примешивают классов контроллеров с AST преобразований. Большинство добавляются из org.codehaus.groovy.grails.plugins.web.api.ControllersApi класса

ControllersApi source

1

Вы правы, контроллеры Grails 'на самом деле не являются контроллерами в том смысле, что они наследуются от базового класса, а скорее просто POGO, которые следуют за соглашением о размещении в каталоге grails-app/controllers. Когда приложение компилируется, 30+ методы смешиваются через AST преобразований, большинство из них идет от

org.codehaus.groovy.grails.plugins.web.api.ControllersApi, но и от org.codehaus.groovy.grails.plugins.converters.api.ConvertersControllersApi, org.codehaus.groovy.grails.plugins.web.api.ControllersMimeTypesApi.

Предыдущее было перефразировано от Programming Grails от Burt Beckwith, и я рекомендовал бы его, если вы заинтересованы в более тонких деталях Grails.

+0

Благодарим вас за ссылки на классы. Они помогают. –

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