Groovy 支援
在 Spring Integration 2.0 中,我們增加了 Groovy 支援,允許您使用 Groovy 指令碼語言為各種整合元件提供邏輯——類似於 Spring 表示式語言 (SpEL) 支援路由、轉換和其他整合方面的方式。有關 Groovy 的更多資訊,請參閱 Groovy 文件,您可以在專案網站上找到。
專案需要此依賴項
-
Maven
-
Gradle
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-groovy</artifactId>
<version>7.0.0</version>
</dependency>
compile "org.springframework.integration:spring-integration-groovy:7.0.0"
此外,從版本 6.0 開始,提供了用於整合流配置的Groovy DSL。
Groovy 配置
使用 Spring Integration 2.1,Groovy 支援的配置名稱空間是 Spring Integration 指令碼支援的擴充套件,並共享在指令碼支援部分中詳細描述的核心配置和行為。儘管 Groovy 指令碼得到了通用指令碼支援的良好支援,但 Groovy 支援提供了Groovy配置名稱空間,該名稱空間由 Spring Framework 的org.springframework.scripting.groovy.GroovyScriptFactory及相關元件提供支援,提供了使用 Groovy 的擴充套件功能。以下清單顯示了兩個示例配置
<int:filter input-channel="referencedScriptInput">
<int-groovy:script location="some/path/to/groovy/file/GroovyFilterTests.groovy"/>
</int:filter>
<int:filter input-channel="inlineScriptInput">
<int-groovy:script><![CDATA[
return payload == 'good'
]]></int-groovy:script>
</int:filter>
如前面的示例所示,配置看起來與通用指令碼支援配置相同。唯一的區別是使用了 Groovy 名稱空間,如int-groovy名稱空間字首所示。另請注意,<script>標籤上的lang屬性在此名稱空間中無效。
Groovy 物件自定義
如果您需要自定義 Groovy 物件本身(除了設定變數),您可以使用customizer屬性引用一個實現GroovyObjectCustomizer的 bean。例如,如果您想透過修改MetaClass並註冊指令碼中可用的函式來實現領域特定語言 (DSL),這可能會很有用。以下示例展示瞭如何實現
<int:service-activator input-channel="groovyChannel">
<int-groovy:script location="somewhere/SomeScript.groovy" customizer="groovyCustomizer"/>
</int:service-activator>
<beans:bean id="groovyCustomizer" class="org.something.MyGroovyObjectCustomizer"/>
設定自定義GroovyObjectCustomizer與<variable>元素或script-variable-generator屬性不是互斥的。它也可以在定義內聯指令碼時提供。
Spring Integration 3.0 引入了variables屬性,它與variable元素協同工作。此外,如果未提供帶有名稱的繫結變數,Groovy 指令碼能夠將變數解析為BeanFactory中的 bean。以下示例展示瞭如何使用變數(entityManager)
<int-groovy:script>
<![CDATA[
entityManager.persist(payload)
payload
]]>
</int-groovy:script>
entityManager必須是應用程式上下文中的適當 bean。
有關<variable>元素、variables屬性和script-variable-generator屬性的更多資訊,請參閱指令碼變數繫結。
Groovy 指令碼編譯器自定義
@CompileStatic提示是最流行的 Groovy 編譯器自定義選項。它可以在類或方法級別使用。有關更多資訊,請參閱 Groovy 參考手冊,特別是@CompileStatic。為了在短指令碼(在整合場景中)中利用此功能,我們被迫將簡單指令碼更改為更像 Java 的程式碼。考慮以下<filter>指令碼
headers.type == 'good'
前面的指令碼在 Spring Integration 中變成以下方法
@groovy.transform.CompileStatic
String filter(Map headers) {
headers.type == 'good'
}
filter(headers)
這樣,filter()方法被轉換並編譯為靜態 Java 程式碼,繞過了 Groovy 呼叫的動態階段,例如getProperty()工廠和CallSite代理。
從版本 4.3 開始,您可以使用compile-static boolean選項配置 Spring Integration Groovy 元件,指定應將ASTTransformationCustomizer用於@CompileStatic新增到內部CompilerConfiguration。有了這個,您可以在指令碼程式碼中省略帶有@CompileStatic的方法宣告,並且仍然獲得編譯的純 Java 程式碼。在這種情況下,前面的指令碼可以很短,但仍然需要比解釋指令碼更冗長一些,如下例所示
binding.variables.headers.type == 'good'
您必須透過groovy.lang.Script binding屬性訪問headers和payload(或任何其他)變數,因為使用@CompileStatic,我們沒有動態GroovyObject.getProperty()功能。
此外,我們引入了compiler-configuration bean 引用。使用此屬性,您可以提供任何其他所需的 Groovy 編譯器自定義,例如ImportCustomizer。有關此功能的更多資訊,請參閱 Groovy 文件中有關高階編譯器配置的內容。
使用compilerConfiguration不會自動為@CompileStatic註解新增ASTTransformationCustomizer,並且它會覆蓋compileStatic選項。如果您仍然需要CompileStatic,您應該手動將new ASTTransformationCustomizer(CompileStatic.class)新增到該自定義compilerConfiguration的CompilationCustomizers中。 |
Groovy 編譯器自定義對refresh-check-delay選項沒有任何影響,並且可過載指令碼也可以靜態編譯。 |