Groovy是一個基於JVM的動態語言,對於一個Java開發者,它最讓我喜歡的地方就是兼容Java的語法,學習使用成本低。從2.0版本開始,Spring就對Groovy這些動態語言提供了支持,結合Spring和Groovy,能夠在Spring中實現Bean的動態裝載,極大的增長了應用代碼的靈活性,下面讓咱們看示例。 php
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:lang="http://www.springframework.org/schema/lang" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 經過component-scan自動裝載Bean,簡化配置 --> <context:component-scan base-package="me.joshua.demo4j.spring.groovy.first.service" /> <!-- 配置動態加載的Bean,基於Spring的Resource支持,可從網絡或本地文件獲取Groovy代碼 --> <lang:groovy id="simple" refresh-check-delay="2000" script-source="path/to/groovy/Simple.groovy" /> </beans>
在Spring中經過lang標籤便可像Java Bean同樣聲明Groovy Bean,也能夠相似的設置構造函數參數,屬性及init/destroy方法。配置中,refresh-check-delay指明檢查代碼更新的間隔,即上一次代碼變化檢查(和重裝載,若是有的話)結束到下一次檢查開始的時間間隔(ms),設置了該屬性,Spring就會按期的檢查代碼的變動,一旦有變化就從新編譯裝載對應的Groovy Bean。script-source則是Groovy代碼的路徑,Spring底層使用其Resource機制進行代碼的獲取,能夠是Http形式、本地文件、或是類路徑下的文件,可參考相應的文檔。 html
package me.joshua.demo4j.spring.groovy.first.script; import ...... class Simple implements ScriptService { @Autowired private MemberService memberService public void run() { Member member = memberService.findMember("daonan.zhan@gmail.com"); System.out.println(member); } }
因爲Groovy是兼容Java語法的,因此能夠徹底按Java代碼編寫,以上代碼就和Java代碼沒有區別,不一樣的只是文件後綴爲.groovy。因爲Groovy對Java類的良好支持,甚至能夠直接使用Spring註解來引入Groovy Bean對其餘Bean的依賴,經過與其餘Bean的協做來實現複雜的業務邏輯。又,由於Groovy Bean是動態生成的,須要提供相應的接口,以便給其餘Bean調用。 java
package me.joshua.demo4j.spring.groovy.first; import ...... @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:simple.xml") public class Demo { @Autowired private ScriptService scriptService; @Test public void run() { try { BufferedReader reader = new BufferedReader(new InputStreamReader( System.in)); while (true) { // 循環獲取輸入,每次有輸入即進行一次調用 String line = reader.readLine(); if ("exit".equals(line)) { break; } scriptService.run(); } } catch (Exception e) { e.printStackTrace(); } } }
在示例代碼的test目錄下,能夠執行單元測試運行示例代碼(在「/src/test/java」目錄中),其中配置裏定義的Groovy Bean在此做爲一個服務被調用。在示例的執行過程當中,能夠修改Groovy代碼來演示其動態裝載的功能。 git
至此,能夠看到Spring對Groovy有着良好的支持,基於Groovy Bean,能夠實現很是靈活可配的業務邏輯。好比,能夠把Groovy Bean的代碼經過網站託管起來,應用代碼在運行時從網站拉取代碼,一旦業務有變動,直接修改託管的代碼,便可在全部應用中生效,這將給應用帶來極大的靈活性。 spring
Spring動態語言 http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/dynamic-language.html 網絡
P.S. 博客已經遷移到BAE,歡迎來踩踩http://home4j.duapp.com/index.php/2013/07/23/spring-groovy-bean-support.html app