(快速参考)

外挂程式

4.0.2

外挂程式

365bet地区365bet地区首先是Web应用程序框架,但它也是一个平台通过公开许多扩展点,这些扩展点使您可以将任何内容从命令行界面扩展到运行时配置引擎,可以自定义365bet地区以适应几乎所有需求。平台您需要做的就是创建一个插件

365bet地区扩展平台可能听起来很复杂,但是插件的范围从简单到强大,如果知道如何构建365bet地区应用程序,就会知道如何为该插件创建插件共享数据模型或一些静态资源

创建和安装插件

创建插件

365bet地区创建365bet地区插件是运行命令的简单问题

grails创建插件>

这将为您指定的名称创建一个Web插件项目,例如运行grails创建插件示例将创建一个新的Web插件项目,名为.

365bet地区在365bet地区中,您应该考虑创建的插件是否需要Web环境,或者该插件是否可以与其他配置文件一起使用。如果您的插件不需要Web环境,请使用插件配置文件代替默认的Web插件配置文件。

grails创建插件个人资料插件

确保插件名称不能连续包含多个大写字母,否则无法正常使用Camel大小写

365bet地区作为常规的365bet地区项目有很多好处,即如果插件定位到Web配置文件,您可以立即运行以测试插件

grails运行应用
默认情况下,插件项目不会提供索引gsp,因为大多数插件都不需要它。因此,如果您尝试在创建插件后立即查看在浏览器中运行的插件,则会收到找不到页面的错误消息,您可以轻松地创建一个365bet地区应用程序观看次数索引gsp为您的插件,如果你想

365bet地区365bet地区插件的结构与365bet地区应用程序项目几乎相同,只是在src主界面365bet地区在插件包结构下的目录中,您会找到一个插件描述符类,该类以365bet地区Plugin结尾。

 grails插件

 365bet地区示例365bet地区插件 延伸插入

所有插件必须在src主界面目录,否则将不被视为插件。plugin类定义有关插件的元数据,以及可选的各种钩入插件扩展点的钩子

您还可以使用几个特殊属性提供有关插件的其他信息

  • 标题插件的简短一句话描述

  • grails版本365bet地区插件支持的365bet地区的版本范围,例如指示或更高

  • 作者插件作者的名字

  • authorEmail插件作者的联系电子邮件

  • 开发商除上述作者以外的任何其他开发人员

  • 描述插件功能的完整多行描述

  • 文件资料插件文档的URL

  • 执照插件许可证

  • 问题管理插件的问题跟踪器

  • SCM插件的源代码管理位置

石英自我
 365bet地区Quartz 365bet地区插件 延伸插入365bet地区插件设计用于的365bet地区版本
    定义grails版本"内置快照"
    插件打包中排除的资源
    定义pluginExcludes"365bet地区应用程序查看错误gsp"
    ]
    定义标题"石英" 插件的标题显示名称
    定义作者"杰夫·布朗"
    定义authorEmail"电子邮件保护"
    定义描述'''\
添加了Quartz作业调度功能'''
    定义型材'']
    清单loadAfter'冬眠的', '冬眠的', '冬眠的', '服务']
    定义文件资料"http grails org插件石英"
    定义"亚太地区"
    定义问题管理: "Github问题", 网址: "http github com grails插件石英问题" ]
    定义: "乔·德夫", 电子邮件: "电子邮件保护" ]
    ]
    定义SCM网址: ""闭包doWithSpring

365bet地区要使您的插件可用于365bet地区应用程序,请运行安装命令

这会将插件安装到您的本地Maven缓存中。然后在应用程序中使用插件,请声明对插件的依赖建立gradle归档并包含mavenLocal在您的存储库哈希中

仓库mavenLocal编译"org grails插件quartz"
365bet地区在365bet地区 x中,插件打包为ZIP文件,但是在365bet地区 x中,插件是简单的JAR文件,可以将其添加到IDE的类路径中。

插件和多项目构建

如果您希望将插件设置为多项目构建的一部分,请按照以下步骤操作

步骤创建应用程序和插件

使用ils命令创建一个应用程序和一个插件

$grails创建应用程序myapp$grails创建插件myplugin

步骤创建设置gradle文件

在同一目录中创建一个设置gradle包含以下内容的文件

包括"myapp", "myplugin"

目录结构应如下

项目目录设置gradle myapp build gradle myplugin build gradle

步骤声明对插件的项目依赖

建立gradle的应用程序声明了对插件的依赖外挂程式

grails插件编译项目'myplugin')
    }
}
您也可以在依存关系阻止,但是如果执行此操作,将不会重新加载子项目

步骤配置插件以启用重新加载

在插件目录中添加或修改gradle属性归档新属性爆炸了需要设置以便插件将分解目录添加到类路径

步骤运行应用程序

现在,使用grails运行应用您可以使用应用程序目录根目录中的命令冗长的标志以查看Gradle输出

$cd myapp$grails运行应用程序冗长

您将从Gradle输出中注意到,插件源已构建并放置在应用程序的类路径中

:myplugincompileAstJava最新myplugincompileAstGroovy截至日期mypluginprocessAstResources截至日期mypluginastClasses截至日期myplugin编译Java至今mypluginconfigScript截止日期myplugin编译GroovymyplugincopyAssets截止日期myplugin截至日期的copyCommandsmyplugincopyTemplates截止日期mypluginprocessResourcesmyapp编译Java至今myapp编译GroovymyappprocessResources截止日期myappmyappfindMainClassmyapp365bet地区bootRun 365bet地区应用程序在以下位置运行http:环境开发中的本地主机

关于排除文物的注意事项

虽然创建插件365bet地区该命令会为您创建某些文件,以便可以在365bet地区应用程序中运行该插件,但在打包插件时不包括所有这些文件。以下是创建但未包含的人工制品的列表包插件:

  • grails应用程序构建gradle虽然它用来产生依赖关系)

  • grails应用配置会议应用yml重命名为yml插件

  • grails app conf春季资源groovy

  • 365bet地区应用程序配置会议日志回切

  • 内在的一切src测试

  • 内的SCM管理文件svnCVS

自定义插件内容

开发插件时,您可以创建在插​​件开发和测试期间使用的测试类和源,但不应将其导出到应用程序中

要排除测试源,您需要修改pluginExcludes插件描述符的属性,并排除您内部的资源建立gradle例如,假设您在带演示插件源代码树中的软件包,但不应将其打包在应用程序中

安装在应用程序中后应由插件加载的资源
  定义pluginExcludes'带演示'
  ]

在你的建立gradle您应该从JAR文件中排除已编译的类

罐排除"带演示"
}

365bet地区365bet地区中的内联插件

365bet地区在365bet地区 x中,可以在中指定嵌入式插件BuildConfig365bet地区在365bet地区 x中,此功能已被Gradle的多项目构建功能所取代

要设置多项目构建,请在父目录中创建一个应用程序和一个插件

$grails创建应用程序myapp$grails创建插件myplugin

然后创建一个设置gradle父目录中的文件,指定您的应用程序和插件的位置

包括'myapp', 'myplugin'

最后在您的应用程序中添加一个依赖项建立gradle在插件上

编译项目'myplugin')

365bet地区使用此技术,您已经获得了365bet地区 x的内联插件的等效功能。

插件存储库

365bet地区在365bet地区中央插件存储库中分发插件

365bet地区分发插件的首选方法是发布到官方的365bet地区中央插件存储库,这将使您的插件对列出插件命令

grails列表插件

其中列出了中央存储库中的所有插件。您的插件也可用于插件信息命令

grails插件信息插件名称

打印有关它的额外信息,例如它的描述是谁写的等等

365bet地区如果您已经创建了365bet地区插件,并希望将其托管在中央存储库中,则会找到有关在插件门户网站

提供基本文物

添加命令行命令

365bet地区插件可以通过以下两种方式之一将新命令添加到365bet地区交互式外壳:您可以创建一个代码生成脚本,该脚本将对应用程序可用。命令将在src主要脚本目录

src主要脚本这里的其他脚本grails应用控制器服务等

代码生成脚本可用于在项目树中创建工件,并自动执行与Gradle的交互

365bet地区如果您想创建一个与已加载的365bet地区应用程序实例进行交互的新Shell命令,则应使用创建命令命令

$grails创建命令MyExampleCommand

这将创建一个名为grails应用程序命令PACKAGE PATH MyExampleCommand groovy延伸应用命令:

 grails dev命令

 MyExampleCommand 实施应用命令布尔值处理ExecutionContext ctx println"你好,世界"
      返回 
  }
}

一个应用命令有权使用365bet地区应用实例,并且像其他任何Spring bean一样会自动装配

365bet地区您还可以通知365bet地区跳过执行Bootstrap常规命令中具有简单属性的文件

 MyExampleCommand 实施应用命令布尔值shipBootstrap

  布尔值处理ExecutionContext ctx

对于每个应用命令365bet地区当前的365bet地区将创建一个shell命令和一个Gradle任务来调用应用命令在以上示例中,您可以调用MyExampleCommand使用任一类

$用我的榜样

$gradle myExample

365bet地区365bet地区版本是所有小写连字符,并且不包括命令后缀

代码生成脚本和应用命令365bet地区实例是后者具有对365bet地区应用程序状态的完全访问权限,因此可用于执行与数据库交互的任务,从而调用GORM等

365bet地区在365bet地区 x Gant中,可以使用脚本在365bet地区 x代码生成中执行这两项任务,并且与运行时应用程序状态的交互已明确分开

添加新的grails应用程序工件Controller Tag Library Service等

插件可以通过在插件中创建相关文件来添加新工件。365bet地区应用

grails应用控制器这里的其他控制器在这里提供其他服务,在这里等其他XXX

提供视图模板和视图分辨率

365bet地区当插件提供控制器时,它可能还会提供要呈现的默认视图。这是通过插件模块化应用程序的绝佳方法,365bet地区视图解析机制将首先在安装该应用程序的应用程序中查找视图,如果失败,将尝试在插件中查找视图这意味着您可以通过在应用程序的应用程序中创建相应的GSP来覆盖插件提供的视图grails应用程序视图目录

例如,考虑一个名为BookController由亚马逊插件提供如果执行的操作是清单365bet地区365bet地区首先会寻找一个名为grails应用程式观看次数清单gsp然后,如果失败,它将寻找相对于插件的相同视图

但是,如果视图使用插件也提供的模板,则可能需要以下语法

<G渲染模板"fooTemplate"插入"亚马逊"/>

请注意插入365bet地区属性,其中包含模板所在的插件的名称。如果未指定,则365bet地区将查找相对于应用程序的模板

排除文物

365bet地区默认情况下,365bet地区在打包过程中不包括以下文件

  • 365bet地区应用程序配置会议日志回切

  • grails应用配置会议应用yml重命名为yml插件)

  • grails app conf春季资源groovy

  • 内在的一切src测试

  • 内的SCM管理文件svnCVS

默认值UrlMappings常规文件不会被排除,因此删除插件正常工作不需要的任何映射。您也可以随意使用其他名称添加UrlMappings定义,包含在内,例如一个名为grails应用程序控制器BlogUrlMappings groovy很好

排除列表可通过以下方式扩展pluginExcludes属性

插件打包中排除的资源
定义pluginExcludes"365bet地区应用程序查看错误gsp"
]

例如,这对于将演示或测试资源包括在插件存储库中而不在最终发行版中包括它们很有用。

评估惯例

在查看基于约定的运行时配置之前,您首先需要了解如何从插件评估这些约定。每个插件都有一个隐式的应用变量,它是365bet地区应用接口

365bet地区应用界面提供了方法来评估项目中的约定,并在内部存储对应用程序中所有工件类的引用

神器实现了365bet地区Class365bet地区代表365bet地区资源(例如控制器或标签库)的接口,例如获取所有365bet地区365bet地区Class你可以做的事

对于grailsClass应用程序所有类println grails类名

365bet地区应用具有一些魔术特性,可以缩小您感兴趣的伪像的类型,例如访问可以使用的控制器

对于controllerClass应用程序控制器类println控制器类名称

动态方法约定如下

  • 班级检索特定工件名称的所有类,例如应用控制器类.

  • 上课检索特定人工制品的命名类,例如应用程序getControllerClass PersonController

  • 是班级退货如果给定的类别是给定的伪像类型,例如应用程序isControllerClass PersonController

365bet地区Class接口具有许多有用的方法,可让您进一步评估和使用约定,包括

  • getPropertyValue获取类上给定属性的初始值

  • hasProperty退货如果类具有指定的属性

  • newInstance创建此类的新实例

  • getName返回应用程序中类的逻辑名称,不包含尾随约定部分(如果适用)

  • getShortName返回没有包前缀的类的简称

  • getFullName返回带有尾随约定部分和包名称的应用程序中类的全名。

  • getPropertyName返回类的名称作为属性名称

  • 返回应用程序中类的逻辑属性名称,不包含结尾约定部分(如果适用)

  • 自然的以自然术语返回属性的名称,例如lastName变为Last Name

  • getPackageName返回包名称

有关完整参考,请参阅给防火墙.

挂钩运行时配置

365bet地区365bet地区提供了许多挂钩来利用系统的不同部分并按照约定执行运行时配置

365bet地区与365bet地区 Spring配置挂钩

365bet地区首先,您可以挂钩365bet地区运行时配置,以覆盖doWithSpring的方法插入365bet地区类,并返回定义其他bean的闭包。例如,以下片段摘自提供以下功能的核心365bet地区插件之一:

 组织Springframework Web servlet在CookieLocaleResolver
 组织springframework Web servlet在LocaleChangeInterceptor
 org springframework上下文支持ReloadableResourceBundleMessageSource
 grails插件

 365bet地区我n365bet地区Plugin 延伸插入定义"0.1"关闭doWithSpring messageSource ReloadableResourceBundleMessageSource基本名称"WEB INF grails应用程序中的消息"localeChangeInterceptor LocaleChangeInterceptor paramName""localeResolver CookieLocaleResolver

365bet地区该插件配置365bet地区messageSourceBean和其他几个Bean来管理区域设置解析并使用春豆建造者这样做的语法

自定义Servlet环境

365bet地区在以前的365bet地区版本中,可以动态修改生成的veh km365bet地区在365bet地区 x中没有veh km文件,因此无法以编程方式修改veh km不再归档

365bet地区但是,可以在365bet地区 x中执行最常见的修改Servlet环境的任务。

添加新的Servlet

如果要添加新的Servlet实例,最简单的方法就是在Bean中定义一个新的Spring bean。doWithSpring方法

关闭doWithSpring Servlet MyServlet

如果您需要自定义servlet,则可以使用Spring Boot。ServletRegistrationBean:

关闭doWithSpring myServlet ServletRegistrationBean我的Servlet"myServlet"2
  }
}}

添加新的Servlet过滤器

就像Servlets一样,配置新过滤器的最简单方法是简单地定义一个Spring bean

关闭doWithSpring myFilter MyFilter

但是,如果您想控制过滤器注册的顺序,则需要使用Spring Boot。FilterRegistrationBean:

myFilter FilterRegistrationBean筛选器豆MyFilter urlPatterns'/*'订购订购的最高精密度
365bet地区365bet地区内部注册的过滤器365bet地区365bet地区WebRequestFilter, 等通过递增定义最高的精度365bet地区通过允许在365bet地区过滤器之前或之间插入几个过滤器

执行后期初始化配置

有时在Spring之后进行一些运行时配置会很有用ApplicationContext已建立在这种情况下,您可以定义doWithApplicationContext关闭属性

 简单插件 延伸插入定义那么"简单"
    定义"1.1"

    覆写
    虚空doWithApplicationContext定义sessionFactory applicationContext sessionFactory
    }
}

在编译时添加方法

365bet地区365bet地区使得从插件向现有人工类型添加新特征变得容易,例如说您想向控制器添加用于操纵日期的方法,这可以通过在中定义特征来完成。src主界面:

myplugin增强("控制者"日期特征日期当前的日期返回  日期()
  }
}

增强

作为使用增强TraitInjector365bet地区告诉365bet地区在编译时要将特征注入哪些伪像

myplugin静态编译
 控制器特质注入器 实施TraitInjector覆写
    getTrait SomeTrait覆写
    []getArtefactTypes'控制者']  []
    }
}

以上TraitInjector将添加SomeTrait给所有控制器getArtefactTypes方法定义了应将特征应用到的伪像的类型

有条件地应用特质

一种TraitInjector实现也可以实现SupportsClassNode接口将特征仅应用到满足自定义要求的人工制品的接口例如,如果仅在目标人工制品类具有特定注释的情况下才应用特征,则可以按以下方式进行操作

myplugin静态编译
 基于注释的特质注入器 实施TraitInjector支持ClassNode覆写
    getTrait SomeTrait覆写
    []getArtefactTypes'控制者']  []
    }

    布尔值支持ClassNode classNode返回365bet地区365bet地区ASTUtils具有Annotation类Node SomeAnnotation

以上TraitInjector将添加SomeTrait只给那些具有注释宣告

该框架通过以下方式发现特质注入者META INF 365bet地区工厂jar文件中的描述符该描述符是自动生成的为上面显示的代码生成的描述符如下所示

365bet地区365bet地区工厂文件grails编译器特征TraitInjector myplugin ControllerTraitInjector myplugin DateTraitTraitInjector
由于上述格式问题,代码段在等号后包含换行符

该文件会自动生成,并在构建时添加到jar文件中。365bet地区工厂归档于src主要资源META INF grails工厂在该文件中明确定义特征注入器非常重要。只有在应用程序未定义自己的元数据时,自动生成的元数据才是可靠的src主要资源META INF grails factores文件

在运行时添加动态方法

基础

365bet地区365bet地区插件使您可以在运行时向任何365bet地区托管的或其他类注册动态方法。doWithDynamicMethods方法

365bet地区请注意,365bet地区 x具有较新的功能,例如可从使用编译的代码中使用的特征静态编译建议仅对特征无法实现的情况添加动态行为
 示例插件 延伸插入虚空doWithDynamicMethods对于controllerClassgrails应用程序controllerClasses controllerClass metaClass myNewMethod println"你好,世界" }
        }
    }
}

在这种情况下,我们使用隐式应用程序对象获取对所有控制器类MetaClass实例的引用,并添加一个名为myNewMethod到每个控制器如果您事先知道该类,则希望向其添加方法可以简单地引用其元类属性

例如,我们可以添加一个新方法swapCasejava长字符串:

 示例插件 延伸插入覆写
    虚空doWithDynamicMethods元类swapCase定义某人 StringBuilder委派每个人字符isUpperCase  四个) ?
                        字符降低大小写  四个) :
                        字符至大写  四个sb toString断言 "上和下" == "上和下"swapCase

与ApplicationContext交互

doWithDynamicMethods春季关闭ApplicationContext实例这很有用,因为它允许您与其中的对象进行交互。例如,如果您正在实现与Hibernate进行交互的方法,则可以使用会话工厂实例与HibernateTemplate:

 org springframework orm休眠HibernateTemplate

 示例Hibernate插件 延伸插入虚空doWithDynamicMethods对于domainClassgrailsApplication domainClasses domainClass metaClass静态负载longID定义sf applicationContext sessionFactory定义模板HibernateTemplate SF模板加载委托ID

另外,由于Spring容器具有自动装配和依赖项注入功能,因此您可以实现更强大的动态构造函数,这些构造函数使用应用程序上下文在运行时将依赖项连接到对象中

 MyConstructor插件 {

    虚空doWithDynamicMethods对于domainClassgrailsApplication domainClasses domainClass metaClass构造函数返回applicationContext getBean domainClass名称

在这里,我们实际上将默认构造函数替换为查找原型Spring bean的构造函数

参加自动重装活动

监控变更资源

365bet地区通常,监视资源以进行更改并在更改发生时执行一些操作很有价值。这就是365bet地区如何在运行时实现应用程序状态的高级重载。例如,考虑一下365bet地区的此简化代码段服务插件:

 365bet地区服务365bet地区插件 延伸观看了插件的资源"文件grails应用服务服务常规"无效onChange<, 宾语事件如果事件来源定义serviceClass grailsApplication addServiceClass事件源定义服务名称"${serviceClass propertyName}"豆子"$服务名称"serviceClass getClazz bean bean自动装配
                }
            }
        }
    }
}

首先它定义watched资源作为包含要监视的资源的引用或模式的字符串或字符串列表,如果被监视的资源在更改时指定了Groovy文件,它将自动重新加载并传递到onChange在关闭事件宾语

事件对象定义了许多有用的属性

  • 事件来源事件的来源或重新加载或春天资源资源

  • 事件ctx春天ApplicationContext实例

  • 事件插件通常管理资源的插件对象这个)

  • 活动申请365bet地区应用实例

  • 事件管理器365bet地区365bet地区插件管理器实例

这些对象可用于帮助您基于更改内容应用适当的更改。在上述“服务”示例中,新的服务bean被重新注册到服务对象中。ApplicationContext当其中一种服务类别更改时

影响其他插件

除了对更改做出反应之外,有时一个插件需要影响另一个插件

以服务和控制器插件为例,当重新加载服务时,除非您重新加载控制器,否则当尝试将重新加载的服务自动连接到较旧的控制器类时,也会出现问题。

为了解决这个问题,您可以指定另一个插件会影响哪些插件。这意味着,当一个插件检测到更改时,它将重新加载自身,然后重新加载其影响的插件。例如,请考虑以下代码段:服务365bet地区插件:

定义影响'']

观察其他插件

如果有一个特定的插件,您想观察其变化,但不必监视它监视的资源,则可以使用observe属性

定义观察""]

在这种情况下,更改控制器后,您还将收到从控制器插件链接的事件

插件还可以使用通配符来观察所有已加载的插件

定义观察"*"]

Logging插件正是这样做的,因此可以添加日志财产回任何在应用程序运行时发生变化的伪像

了解插件加载顺序

控制插件依赖性

插件通常取决于其他插件的存在,并且可以根据其他插件的存在进行适应。这是通过两个属性实现的:第一个称为取决于例如,从Hibernate插件中查看此片段

 365bet地区Hibernate365bet地区插件 {

    定义"1.0"

    定义取决于数据源: "1.0",
                     domainClass: "1.0",
                     : "1.0",
                     核心: "1.0"]
}

Hibernate插件取决于四个插件的存在。数据源, domainClass, 核心外挂程式

依赖项将在Hibernate插件之前加载,如果所有依赖项均未加载,则插件将不会加载

取决于属性还支持一种用于指定版本范围的微型表达式语言。下面是一些语法示例:

定义取决于: "* > 1.0"]
定义取决于: "1.0 > 1.1"]
定义取决于: "1.0 > *"]

使用通配符时,它表示任何版本。表达式语法还排除任何后缀,例如BETA ALPHA等,因此该表达式将与以下任何版本匹配

  • 1.1

  • 1.0

  • 1.0.1

  • 快照

  • 测试版

控制装载顺序

使用取决于建立硬依赖关系,如果未解决依赖关系,则插件将放弃并不会加载。使用loadAfterloadBefore属性

定义loadAfter'']

在这里,插件将在插件(如果存在),否则将被加载。该插件可以适应其他插件的存在,例如Hibernate插件在其代码中包含此代码doWithSpring关闭

如果365bet地区经理has365bet地区Plugin""openSessionInViewInterceptor openSessionInViewInterceptor flushMode HibernateAccessor FLUSH MANUAL sessionFactory sessionFactory grailsUrlHandlerMapping拦截器openSessionInViewInterceptor

在这里,Hibernate插件只会注册一个OpenSessionInViewInterceptor如果插件已加载经理变量是的实例365bet地区插件管理器界面,它提供了与其他插件进行交互的方法

您也可以使用loadBefore属性,用于指定您的插件应先加载的一个或多个插件

定义loadBefore'Rabbitmq']

范围和环境

不仅可以控制插件的加载顺序,还可以指定插件应加载的环境以及构建的作用域阶段,只需在插件描述符中声明其中一个或两个属性即可。

定义环境'发展', '测试', 'myCustomEnv']
定义范围排除:'战争']

在此示例中,该插件仅会在开发和测试环境中加载,也不会打包到WAR文件中,因为它已被排除在战争阶段之外。仅发展插件不得打包用于生产用途

可用范围的完整列表由枚举定义建筑范围但这是一个总结

  • 测试运行测试时

  • 功能测试运行功能测试时

  • 用于运行应用程序和进行战争

  • 战争将应用程序打包为WAR文件时

  • 所有插件适用于所有范围默认

这两个属性可以是以下之一

  • 唯一的字符串

  • 列出要包括的环境或范围的列表

  • 完全控制的映射,包含和/或排除键可以具有字符串或列表值

例如

定义环境"测试"

仅在测试环境中包含插件,而

定义环境"发展", "测试"]

将其包含在两个开发中最后的测试环境

定义环境包括: ["发展", "测试"]]

会做同样的事情

Artefact API

365bet地区您现在应该了解365bet地区拥有人工制品的特殊类型的概念,它知道并且可以与常规Groovy和Java类区别对待,例如通过使用额外的属性和方法对其进行增强,人工制品的示例包括域类和控制器。可能没有意识到的是365bet地区允许应用程序和插件开发人员访问人工制品的基础结构,这意味着您可以找出可用的人工制品,甚至自己对其进行增强,甚至可以提供自己的自定义人工制品类型

询问可用的文物

作为插件开发人员,重要的是要找出应用程序中可用的域类控制器或其他类型的人工制品,例如Elasticsearch插件需要知道存在哪些域类,以便可以检查它们是否存在可搜寻的属性并为适当的属性建立索引,那么它是如何做到的答案在于grails应用对象和实例365bet地区应用可以在控制器和GSP中自动使用,并且可以注入的其他地方

grails应用对象具有几种重要的属性和查询伪像的方法,最常见的可能是为您提供特定伪像类型的所有类别的对象

对于CLSgrails应用班级

在这种情况下artefactType365bet地区是人工制品类型的属性名称形式

  • 控制者

  • tagLib

  • 服务

  • 编解码器

  • 引导程序

  • urlMappings

因此,例如,如果您想遍历使用的所有域类

对于CLSgrails应用程序域类

和用于URL映射

对于CLSgrailsApplication urlMappingsClasses

您需要注意,这些属性返回的对象不是以下对象的实例相反,它们是365bet地区Class具有一些特别有用的属性和方法,包括用于基础:

  • 简称没有与之等效的包装的人工制品的类名类simpleName).

  • logicalPropertyName属性形式的伪像名称,不带类型后缀SoMyGreatController成为我的伟大

  • isAbstract指示artefact类是否为抽象的布尔值

  • getPropertyValue名称返回给定属性的值,无论它是静态的还是实例的。如果在声明e上初始化该属性,则效果最佳静态交易真.

artefact API还允许您按名称获取类,并检查类是否为人工制品

  • 得到类字符串名称

  • 班级爵士乐

第一种方法将检索365bet地区Class给定名称的实例e g MyGreatController第二个实例将检查类是否为特定类型的人工制品。例如,您可以使用grailsApplication isControllerClass组织示例MyGreatController检查是否MyGreatController实际上是控制者

添加您自己的文物类型

插件可以轻松提供自己的伪像,以便他们可以轻松找到可用的实现并参与重新加载。您所要做的就是创建一个ArtefactHandler实现并将其注册到您的主插件类中

 365bet地区My365bet地区插件 {
    定义Artefacts组织MyArtefactHandler

人工制品列表可以包含上述处理程序类或处理程序实例

那么,伪像处理程序的外观是什么呢?简单地说,它是ArtefactHandler接口为了使生活更轻松,有一个可以轻松扩展的框架实现ArtefactHandlerAdapter.

除了处理程序本身之外,每个新工件都需要一个相应的包装器类,该包装器类实现365bet地区Class骨架实现再次可用,例如365bet地区AbstractInjectable365bet地区Class这特别有用,因为它可以将您的人工制品变成可以自动连线的Spring bean,就像控制器和服务一样

理解处理程序类和包装程序类如何工作的最好方法是查看Quartz插件

另一个例子是白p-杜松子酒这增加了一个领域的人工制品