日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Grails 1.2参考文档速读(19):插件

發布時間:2024/9/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Grails 1.2参考文档速读(19):插件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Grails是一個插件架構,這一點我們已經在前面體會到了,最典型的就是GORM一節中,我們明明沒有定義crud操作,但在運行時卻可以使用它,造成這一結果的“元兇”就是我們預先安裝的Hibernate插件。在這一節里,我們將對這背后的機制進行一番探究,對插件有一個基本的了解。Plugin是Grails的主要擴展點,其工程跟普通Grails工程并無區別,只是多了一個描述文件。描述文件位于位于工程根目錄,是以GrailsPlugin結尾的Groovy文件。同時,工程中缺省沒有URL Mappings,因此Controller無法馬上工作,如果需要則必須手工添加該文件。插件相關的命令如下:
  • grails create-plugin
  • grails run-app
  • grails package-plugin
  • grails install-plugin url(或路徑)
  • grails list-plugins:列出插件倉庫中插件
  • grails plugin-info 插件名:列出插件信息
  • grails release-plugin
插件的描述文件定義了插件的相關信息,主要的屬性有:
  • version:版本
  • title:短描述
  • author:作者
  • authorEmail:作者的Email
  • description:長描述
  • documentation:文檔URL
插件完成之后,需要進行打包發布,在打包時需要注意,以下內容會被排除:
  • grails-app/conf/DataSource.groovy
  • grails-app/conf/UrlMappings.groovy
  • build.xml
  • /web-app/WEB-INF目錄中所有內容
  • 插件文件中pluginExcludes定義的內容,如:
    def pluginExcludes = ["grails-app/views/error.gsp"]
雖然UrlMappings.groovy會被排除,但是xxxUrlMappings.groovy并不在此列。同時,如果需要,你還可以修改工程的_Install.groovy腳本改變打包行為。插件最終的發布位置是“倉庫”。缺省倉庫是:http://plugins.grails.org,Grails也支持配置多個倉庫。在Grails中,自定義倉庫的主要目的有2個:發現和發布,前者相對于插件的使用者,后者相對于插件的創作者。配置文件是grails-app/conf/BuildConfig.groovy或USER_HOME/.grails/settings.groovy,前者針對于單個項目,后者則是多項目間共享。配置內容:grails.plugin.repos.discovery.myRepository="http://svn.codehaus.org/grails/trunk/grails-test-plugin-repo" grails.plugin.repos.distribution.myRepository="https://svn.codehaus.org/grails/trunk/grails-test-plugin-repo"如果倉庫設有用戶名/口令,URL格式:PROTOCOL://USERNAME:PASSWORD@SERVER……Grails的命令一般是自動解析倉庫位置,也可以在命令中指定使用哪個倉庫:
  • 在指定倉庫中查找,grails list-plugins -repository=myRepository
  • 在指定倉庫中發布,grails release-plugin -repository=myRepository
命令缺省的倉庫搜索順序為:default、core、自定義倉庫。改變順序則在配置文件中書寫:grails.plugin.repos.resolveOrder=['myRepository','default','core']如果想只解析指定倉庫:grails.plugin.repos.resolveOrder=['myRepository']安裝插件時,需要注意其對使用工程的影響。它會影響使用工程的目錄結構:
  • 原Plugin工程的grails-app目錄內容移至plugins/plugin-version/grails-app。
  • 原Plugin工程中web-app的靜態內容移至web-app/plugins/plugin-version。
  • 原Plugin工程的Java和Groovy內容編譯到web-app/classes
鑒于以上目錄改變,在Plugin工程中使用pluginContextPath引用目錄。<g:createLinkTo dir="${pluginContextPath}/js" file="mycode.js" />Plugin工程中的一些部件的創建方法和普通Grails工程一樣:Script、Controller、Tag Lib、Server、DomainClass等。其中view的查找順序是:首先查找所安裝App中的view,再查看插件中的。如果使用的template是插件的,那么寫成:<g:render template="fooTemplate" plugin="amazon"/>每個Plugin工程都有一個application變量,它是GrailsApplication接口實例。每個GrailsApplication接口提供了計算項目內部慣例的方法,內部使用GrailsClass保存引用。GrailsClass代表一個物理的Grails資源,如一個Controller或一個標簽庫。application主要的動態方法有:
  • *Classes,獲得某artefact的所有類:application.controllerClasses
  • get*Class,獲得某artefact的指定類:application.getControllerClass("ExampleController")
  • is*Class,判斷指定類是否是某artefact:application.isControllerClass(ExampleController.class)
GrailsClass的主要接口:
  • getPropertyValue
  • hasProperty
  • newInstance
  • getName
  • getShortName
  • getFullName
  • getPropertyName
  • getLogicalPropertyName
  • getNaturalName
  • getPackageName
插件工程中的腳本:
  • scripts/_Install.groovy,plugin被安裝后觸發
  • scripts/ _Update.groovy,update命令觸發
以下的內容將說明,插件的一些“神跡”,如上面Domain Class中自動出現的CRUD,實現的原因。所有這些都要歸因于插件參與了動態配置。在描述文件中定義以下閉包,將定義插件在動態配置時的行為:
  • doWithSpring:Spring配置,使用Spring Bean Builder。
  • doWithWebDescriptor:web.xml,使用XmlSlurper。
  • doWithApplicationContext:ApplicationContext構建之后。
  • doWithDynamicMethods:動態增加動態方法
導致DomainClass中憑空多出的CRUD方法的正是doWithDynamicMethods,使用例子:class ExamplePlugin {def doWithDynamicMethods = { applicationContext ->application.controllerClasses.metaClass.each { metaClass ->metaClass.myNewMethod = {-> println "hello world" }}} }以上代碼將給所有Controller都添加一個myNewMethod,其作用就是打印一行“hello world”。建議下載Grails的源碼,然后搜一搜插件的描述文件,讀一讀,或許你會有其他的收獲。Grails也為插件自動重載提供了支持。描述文件中以下幾個屬性(或閉包)涉及Plugin的自動重載:
  • watchedResources屬性:監測的資源。
  • onChange閉包:監視資源發生變化時調用,傳入event對象,它的主要屬性:event.source,事件源,重載的類或Spring資源;event.ctx,Spring的ApplicationContext實例;event.plugin,管理資源的plugin對象(通常是this);event.application,GrailsApplication實例
  • influences屬性:定義影響的plugin,在重載時會一并載入。方向:由此及彼。
    def influences = ['controllers']
  • observe屬性:定義觀察的plugin,當那個插件變化時,獲得變化通知事件。方向:由彼及此。
    def observe = ["hibernate"]def observe =["*"]
看看例子:class ServicesGrailsPlugin {def watchedResources = "file:./grails-app/services/*Service.groovy"def onChange = { event ->if(event.source) {def serviceClass = application.addServiceClass(event.source)def serviceName = "${serviceClass.propertyName}"def beans = beans {"$serviceName"(serviceClass.getClazz()) { bean ->bean.autowire = true}}if(event.ctx) {event.ctx.registerBeanDefinition(serviceName,beans.getBeanDefinition(serviceName))} }}}插件之間可以有依賴關系,因此這就引出了跟插件加載順序相關的話題。這其中涉及兩個屬性:dependsOn和loadAfter。dependsOn:定義了強依賴,如果依賴沒有得到滿足,Plugin不會加載。
  • 例1: def dependsOn = [dataSource:1.0, core: 1.0]
  • 例2: def dependsOn = [foo:"1.0 > 1.1"]。該表達式表示1.0~1.1版,包括1.0和1.1。可以使用*代表任意版本,如[foo:"* > 1.0"]、[foo:"1.0 > *"] 。
loadAfter:定義了弱依賴,如依賴沒有滿足,也會加載。但是Plugin可以在程序內部查看依賴是否滿足(使用GrailsPluginManager),以決定是否提供高級操作。以上就是插件的基本情況,除了這些,如今Grails社區已經就一點達成共識:使用插件作為一種模塊化的機制,通過給主程序安裝不同插件,逐步達成應用需求。

轉載于:https://blog.51cto.com/bcptdtptp/306638

總結

以上是生活随笔為你收集整理的Grails 1.2参考文档速读(19):插件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。