Groovy 支援
在 Spring Integration 2.0 中,我們添加了 Groovy 支援,允許您使用 Groovy 指令碼語言為各種整合元件提供邏輯 — 類似於 Spring Expression Language (SpEL) 對路由、轉換和其他整合方面的支援。有關 Groovy 的更多資訊,請參閱 Groovy 文件,您可以在其專案網站上找到。
您需要在專案中包含此依賴項
-
Maven
-
Gradle
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-groovy</artifactId>
<version>6.4.4</version>
</dependency>
compile "org.springframework.integration:spring-integration-groovy:6.4.4"
此外,從 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 選項沒有任何影響,並且可重新載入的指令碼也可以靜態編譯。 |