http://www.ibm.com/developerworks/cn/java/j-groovierspring2.html
http://blog.csdn.net/qq362228416/article/details/8811136
http://ronxin999.blog.163.com/blog/static/42217920201151611392947/
Groovy是一個基於JVM的動態語言,對於一個Java開發者,它最讓我喜歡的地方就是兼容Java的語法,學習使用成本低。從2.0版本開始,Spring就對Groovy這些動態語言提供了支持,結合Spring和Groovy,可以在Spring中實現Bean的動態裝載,極大的增加了應用代碼的靈活性,下面讓我們看示例。
1. Groovy Bean的引入
<?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形式、本地文件、或是類路徑下的文件,可參考相應的文檔。
2. Groovy Bean的實現
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調用。
3. 示例運行
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代碼來演示其動態裝載的功能。
4. 示例代碼的說明
- 代碼托管在Git@OSC上,歡迎下載運行,http://git.oschina.net/joshuazhan/demo4j.git;
- 本示例的項目路徑為“demo4j/spring/groovy/first”,需要使用Maven來生成工程,“mvn eclipse:eclipse”;
- 示例指定了1.6的JDK版本,有需要可以在pom中修改jdk.version的值;
- 配置文件在“/src/main/resources”目錄下,其中groovy.properties保存了Groovy代碼的地址,默認使用的是Git@OSC的地址,在運行時可修改成本地的文件地址,以便動態修改Groovy Bean代碼。
5. 小結
至此,可以看到Spring對Groovy有着良好的支持,基於Groovy Bean,可以實現非常靈活可配的業務邏輯。比如,可以把Groovy Bean的代碼通過網站托管起來,應用代碼在運行時從網站拉取代碼,一旦業務有變更,直接修改托管的代碼,即可在所有應用中生效,這將給應用帶來極大的靈活性。