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