gpt4 book ai didi

grails - Grails Controller 的 "expando"方法从何而来?

转载 作者:行者123 更新时间:2023-12-02 14:56:52 26 4
gpt4 key购买 nike

根据documentation ,Grails Controller 只是一个在名称后附加“Controller”并保存在 grails-app/controllers/ 中的类。 .此类中最简单的是:

package some.package

class FooController {
def index = {}
}

当 Grails 应用程序运行时,此 Controller 将继承一些标准方法,如 getParamsgetSession .从随附的屏幕截图中,我可以看到这些是通过 groovy.lang.ExpandoMetaClass 添加的。 .我没有看到这是如何发生的。 Controller 不实现任何接口(interface)或扩展任何抽象。这些方法从何而来?

Controller object graph

最佳答案

从 Grails 2.0 开始,采用了一种新方法来将动态方法添加到 Controller 工件中。您可以逐步访问它们以查看这些属性是如何添加到 Controller 中的:-

  • grails 中的 Controller 不是 grails-core 的一部分,而是一个名为 grails-plugin-controllers 的 grails 插件。 .
  • 作为插件,对应的*GrailsPlugin类将定义插件的行为。
  • ControllersApi (扩展 CommonWebApi)包含所有要添加到 Controller 工件的属性。 (从 Grails 2.0 引入)
  • ControllerGrailsPlugin将 ControllersApi 注册为 spring bean .
  • 仅将 ControllerApi 添加为 bean 还有更多内容。
  • 有一个概念MetaClassEnhancer这将采用/考虑一个 API(在本例中为 ControllerApi)并通过使用反射将 CachedMethods 添加到人工制品中来增强/协调人工制品( Controller )与相应的 API,这是 BaseApiProvider 的作用存在于 grails-core 中。
  • 这个magic happens in the Controller plugin class也是。

  • 现在,在 Grails 2.0 之前,采用了一种不同的方法来将动态属性添加到 Controller 。这种方式在运行时将元类属性添加到 Controller 中,发现效率较低。每个动态属性都由其自己的类(即:GetParamsDynamicProperty、GetSessionDynamicProperty)表示,该类目前未使用。

    因此,您现在需要在对象树中查看这些动态方法的内容是 this。其中 CachedMethods 在 Controller 中可用。希望有帮助。如果您寻求更多,我很乐意添加更多。 :-)

    关于grails - Grails Controller 的 "expando"方法从何而来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18873172/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com