Spring對Groovy Bean的支持

Groovy是一個基於JVM的動態語言,對於一個Java開發者,它最讓我喜歡的地方就是兼容Java的語法,學習使用成本低。從2.0版本開始,Spring就對Groovy這些動態語言提供了支持,結合Spring和Groovy,能夠在Spring中實現Bean的動態裝載,極大的增長了應用代碼的靈活性,下面讓咱們看示例。 php

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形式、本地文件、或是類路徑下的文件,可參考相應的文檔。 html

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調用。 java

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代碼來演示其動態裝載的功能。 git

4. 示例代碼的說明

  1. 代碼託管在Git@OSC上,歡迎下載運行,http://git.oschina.net/joshuazhan/demo4j.git
  2. 本示例的項目路徑爲「demo4j/spring/groovy/first」,須要使用Maven來生成工程,「mvn eclipse:eclipse」;
  3. 示例指定了1.6的JDK版本,有須要能夠在pom中修改jdk.version的值;
  4. 配置文件在「/src/main/resources」目錄下,其中groovy.properties保存了Groovy代碼的地址,默認使用的是Git@OSC的地址,在運行時可修改爲本地的文件地址,以便動態修改Groovy Bean代碼。

5. 小結

至此,能夠看到Spring對Groovy有着良好的支持,基於Groovy Bean,能夠實現很是靈活可配的業務邏輯。好比,能夠把Groovy Bean的代碼經過網站託管起來,應用代碼在運行時從網站拉取代碼,一旦業務有變動,直接修改託管的代碼,便可在全部應用中生效,這將給應用帶來極大的靈活性。 spring

6. 參考

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

相關文章
相關標籤/搜索