我們正在尋找groovy腳本的包含機制,以便爲橫切關注點留出空間。Groovy是否提供包含機制?
在我的示例中,我們將Web服務端點視爲常規腳本,並且希望登錄到我們的Web服務協議。爲此,我們使用我們的隱式對象(從我們的框架中獲取)來創建日誌記錄語句。
但是,如果我們在每個Web服務端點中編寫代碼,這是樣板代碼。
我們正在尋找像include()這樣的東西,其中包括其他groovy腳本,有沒有什麼想法如何做到這一點?
我們正在尋找groovy腳本的包含機制,以便爲橫切關注點留出空間。Groovy是否提供包含機制?
在我的示例中,我們將Web服務端點視爲常規腳本,並且希望登錄到我們的Web服務協議。爲此,我們使用我們的隱式對象(從我們的框架中獲取)來創建日誌記錄語句。
但是,如果我們在每個Web服務端點中編寫代碼,這是樣板代碼。
我們正在尋找像include()這樣的東西,其中包括其他groovy腳本,有沒有什麼想法如何做到這一點?
既然你已經提到的「跨部門,關注」我說,你需要攔截您的Web服務調用AOP風格(不是包含機制)。
Grails與Spring framework完全集成,所以這是開發Spring AOP特性的一個很好的選擇。看看grails官方指南的這一章: http://grails.org/doc/latest/guide/14.%20Grails%20and%20Spring.html並搜索單詞AOP。
也許有一個purely groovy way做AOP,但我會用grails和spring去。
Groovy將它的文件視爲對象(認爲它是自動換行)。它使java classpath中的所有.groovy文件都可以作爲類來使用。所以,如果你有文件util.groovy,包含這樣的事情裏面:
def static AuxMethod() {
return "Hello World"
}
從另一個文件中調用它,你只寫:
println util.AuxMethod()
就是這樣。再次,確保您的util.groovy文件位於類路徑中。
我懷疑只有你的groovy腳本是面向對象的類纔有效。使用常規功能腳本,可能不起作用? – djangofan 2011-06-19 03:26:07
如果util.groovy腳本使用大寫Util.groovy重命名,並且引用相應地更改爲'println Util.AuxMethod()' – Blaine 2011-10-20 18:24:35
我之前的評論的後續內容,則此示例僅適用於Windows,至少從Windows開始。這也適用於UNIX。直到我將「util」重命名爲「Util」後才能工作。此外,大多數經驗Java + Groovy開發人員將編寫方法聲明以符合Java約定:static def auxMethod。即類型名稱前的「static」和所有方法以小寫開頭(例如,請參閱java.util.Collections中的大量靜態方法)。 – Blaine 2011-10-24 12:08:26
從當前腳本調用腳本u.groovy
,沿原來的參數給u.groovy傳球,運行
run(new File('u.groovy'), args)
很明顯,你還可以發送任何你想要的字符串參數:
run(new File('u.groovy'),
['one', new File('two.text').absolutePath] as String[])
我做了一些關於這個我正在創建的域特定語言的研究。有三種可能性:
將您的類創建爲繼承父類groovy類。將您的共享代碼放在基類中。
使用ScriptBaseClass請參見http://groovy.codehaus.org/Embedding+Groovy。這是您創建所有腳本的類。
使用導入靜態方法功能。請注意,您可以在java容器內執行此操作(請參閱http://mrhaki.blogspot.com/2011/06/groovy-goodness-add-imports.html)。
所有這些都很好。我的首選是ScriptBaseClass。這效果最好,如果通用代碼就是Groovy(該ScriptBaseClass 必須是一個常規類,它不可能是一個Java類。)
當然,所有這些物品,你仍然需要實際調用常規代碼中的常用方法。例如:
doCommonStuff();
.
. do the rest of it here
.
這不是太可怕,我不認爲。當然就像添加某種#include預處理器語句一樣。
最後,所有這些都假定您可以訪問調用Groovy代碼的java程序。如果情況並非如此,您仍然可以使用靜態導入。這只是一個額外的代碼行。
import static com.mycompany.mycode.doCommonStuff
doCommonStuf()
.
. do the rest of it here
.
如果不解釋如何製作或獲取Script對象,則無用,因爲該類是抽象的。 – Blaine 2011-10-20 16:12:21
通常,將調用此代碼編譯爲匿名'Script'子類的實例。 – 2014-05-01 17:39:21