groovy是一门基于JVM的动态语言,跟spring结合更显强大,废话不多说,直接上例子
1、定义java接口 Foo.java
package groovy; public interface Foo { void execute(); }
2、定义Groovy实现类FooImpl.groovy
package groovy import groovy.Foo class FooImpl implements Foo { void execute() { println("hello!"); } }
3、定义spring配置文件 applicationContext.xml
<?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:lang="http://www.springframework.org/schema/lang" xmlns:gorm="http://grails.org/schema/gorm" xsi:schemaLocation="http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-3.1.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://grails.org/schema/gorm http://grails.org/schema/gorm/gorm.xsd"> <lang:groovy refresh-check-delay="500" script-source="groovy/FooImpl.groovy"></lang:groovy> </beans>
4、测试类GroovyTest.java
package groovy; import java.util.Scanner; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class GroovyTest { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Foo foo = context.getBean(Foo.class); Scanner in = new Scanner(System.in); while (true) { System.out.println("输入任意键"); in.next(); foo.execute(); } } }
ok,运行测试
修改FooImpl.groovy
package groovy import groovy.Foo class FooImpl implements Foo { void execute() { println("hello world!"); } }
到控制台再次输入
测试成功,程序不用重启,即可看到修改后的结果,再也不用其他热加载的插件了。
但是这样感觉不太爽,要是有很多接口实现类的话,不是要写一大堆配置文件?
虽然可以copy,也可以自动生成,但是我觉得还是不够完美,想个办法解决掉,办法就是动态加载bean,编写一个初始化bean,下次直接用即可。
该bean需要实现ApplicationContextAware接口,该接口可以拿到ApplicationContext,也就是spring容器,有了这个,我们就可以自己加一些bean到这个容器当中了。
为了实现这个效果,我可是花了不少功夫,由于网上又没有这个资料,只能自己硬着头皮,看源代码,终于皇天不负有心人 被我实现了,拿来共享一下
1、首先需要顶一个一个类实现ApplicationContextAware接口 GroovyFactory.java
package groovy; import org.springframework.beans.BeansException; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.support.GenericBeanDefinition; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; public class GroovyFactory implements ApplicationContextAware { @Override public void setApplicationContext(ApplicationContext context) throws BeansException { // 只有这个对象才能注册bean到spring容器 DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) context.getAutowireCapableBeanFactory(); // 因为spring会自动将xml解析成BeanDefinition对象然后进行实例化,这里我们没有用xml,所以自己定义BeanDefinition // 这些信息跟spring配置文件的方式差不多,只不过有些东西lang:groovy标签帮我们完成了 GenericBeanDefinition bd = new GenericBeanDefinition(); bd.setBeanClassName("org.springframework.scripting.groovy.GroovyScriptFactory"); final String refreshCheckDelay = "org.springframework.scripting.support.ScriptFactoryPostProcessor.refreshCheckDelay"; final String language = "org.springframework.scripting.support.ScriptFactoryPostProcessor.language"; // 刷新时间 bd.setAttribute(refreshCheckDelay, 500); // 语言脚本 bd.setAttribute(language, "groovy"); // 文件目录 bd.getConstructorArgumentValues().addIndexedArgumentValue(0, "groovy/FooImpl.groovy"); // 注册到spring容器 beanFactory.registerBeanDefinition("Foo", bd); } }
2、然后将这个bean配置到applicationContext.xml
<?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:lang="http://www.springframework.org/schema/lang" xmlns:gorm="http://grails.org/schema/gorm" xsi:schemaLocation="http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-3.1.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://grails.org/schema/gorm http://grails.org/schema/gorm/gorm.xsd"> <!-- <lang:groovy refresh-check-delay="500" script-source="groovy/FooImpl.groovy"></lang:groovy> --> <bean class="groovy.GroovyFactory"></bean> <bean class="org.springframework.scripting.support.ScriptFactoryPostProcessor"/> </beans>
3、这个多出了一个bean配置,事实上,这个bean在我们采用第一种方法配置的时候,spring后自动创建这个bean,然后我们没有采用这个方式,所以只能手动配置
4、运行程序,应该更刚才的结果是一样的
写到这里,可能会有人说我是多此一举了,不急,只要把GroovyFactory稍微修改一下,让其接受一个参数,其作用就明显,其参数是一个目录名,得到此目录名后,我们的bean就可以去扫描这个目录下的所有groovy文件,然后将其动态添加到spring容器中,这样无论我们添加了多少groovy类,都不需要去修改配置了,继续...
修改GroovyFactory.java
package groovy; import java.io.File; import java.io.FileFilter; import org.springframework.beans.BeansException; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.support.GenericBeanDefinition; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; public class GroovyFactory implements ApplicationContextAware { private String directory; public String getDirectory() { return directory; } public void setDirectory(String directory) { this.directory = directory; } @Override public void setApplicationContext(ApplicationContext context) throws BeansException { // 只有这个对象才能注册bean到spring容器 DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) context.getAutowireCapableBeanFactory(); // 因为spring会自动将xml解析成BeanDefinition对象然后进行实例化,这里我们没有用xml,所以自己定义BeanDefinition // 这些信息跟spring配置文件的方式差不多,只不过有些东西lang:groovy标签帮我们完成了 final String refreshCheckDelay = "org.springframework.scripting.support.ScriptFactoryPostProcessor.refreshCheckDelay"; final String language = "org.springframework.scripting.support.ScriptFactoryPostProcessor.language"; String realDirectory = Thread.currentThread().getContextClassLoader().getResource(directory).getFile(); File root = new File(Thread.currentThread().getContextClassLoader().getResource(".").getFile()); File[] files = new File(realDirectory).listFiles(new FileFilter() { @Override public boolean accept(File pathname) { return pathname.getName().endsWith(".groovy") ? true : false; } }); for (File file : files) { GenericBeanDefinition bd = new GenericBeanDefinition(); bd.setBeanClassName("org.springframework.scripting.groovy.GroovyScriptFactory"); // 刷新时间 bd.setAttribute(refreshCheckDelay, 500); // 语言脚本 bd.setAttribute(language, "groovy"); // 文件目录 bd.getConstructorArgumentValues().addIndexedArgumentValue(0, file.getPath().replace(root.getPath(), "")); // 注册到spring容器 beanFactory.registerBeanDefinition(file.getName().replace(".groovy", ""), bd); } } }
接着修改applicationContext.xml
<?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:lang="http://www.springframework.org/schema/lang" xmlns:gorm="http://grails.org/schema/gorm" xsi:schemaLocation="http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-3.1.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://grails.org/schema/gorm http://grails.org/schema/gorm/gorm.xsd"> <!-- <lang:groovy refresh-check-delay="500" script-source="groovy/FooImpl.groovy"></lang:groovy> --> <bean class="groovy.GroovyFactory"> <property name="directory" value="groovy"/> </bean> <bean class="org.springframework.scripting.support.ScriptFactoryPostProcessor"/> </beans>
运行程序,结果跟上面一样,不一样的就是GroovyFactory从加载单个类,变成扫描目录,更实用了。
项目结构如下:
项目文件就不贴了,有需要的留言吧,累死了
原文来自我的CSDN博客:http://blog.csdn.net/qq362228416/article/details/8811136
相关推荐
Grails 是一个基于 Groovy 语言的开源Web应用框架,它构建在Spring Boot之上,旨在简化开发流程并提高生产力。Grails 的设计目标是提供一种灵活、高效的开发环境,使得开发人员可以快速构建高质量的、企业级的Web...
总的来说,"groovy+maven+spring"的结合为Java开发带来了很大的便利。Groovy提供了动态语言的灵活性,Maven保证了项目的构建和依赖管理,而Spring则提供了强大的容器和框架支持。通过远程注入Groovy脚本,开发者可以...
2. **Gradle**: Gradle是一种强大的构建自动化工具,适用于Java、Groovy和Kotlin等语言。它基于Groovy编写构建脚本,提供了灵活的构建配置和依赖管理。相比Maven,Gradle支持更复杂的项目结构,允许自定义构建逻辑,...
本项目是基于Java语言,采用Spring Boot、MongoDB、Groovy和Elasticsearch等现代技术框架搭建的一个轻量级实时风控系统。以下是这个项目涉及的关键知识点: 1. **Spring Boot**: Spring Boot简化了Spring应用程序...
8. **与其他Java库的集成**:Groovy可以无缝地与Java库和框架集成,如Spring、Hibernate等。 9. **Groovy AST转型**:高级话题,了解如何使用抽象语法树(AST)转型自定义语言特性。 10. **性能考虑**:虽然Groovy...
至于压缩包文件名"groovy-web-spring",很可能是包含了一个或多个示例项目,用于演示Groovy和Spring在Web开发中的整合。这些示例可能涵盖从简单的Hello World应用到复杂的MVC结构,甚至可能涉及到数据库操作和...
标题 "Groovy+Tapestry5+Spring2.5+Hibernate3.2实现CRUD" 涉及到的是一个使用几种技术栈构建Web应用程序的示例。这个项目结合了Groovy、Tapestry 5、Spring 2.5和Hibernate 3.2,旨在展示如何在实际开发中进行数据...
在IT行业中,构建高效、可维护的Web应用是至关重要的,而`Gradle`、`Spring`、`Spring MVC`、`Spring JDBC`以及`MySQL`的组合正是这样的一个强大工具链。这篇知识概述将详细讲解如何利用这些技术在IntelliJ IDEA...
10. **Spring Boot CLI**:Spring Boot命令行接口(CLI)是快速试用和开发Spring Boot应用的工具,可以通过命令行编写和运行Groovy脚本。 11. **微服务架构**:Spring Boot是微服务架构的理想选择,可以轻松创建...
在软件开发中,Spring框架以其强大的依赖注入和面向切面编程特性,成为了Java企业级应用的事实标准。而在动态语言的使用上,Groovy凭借其简洁的语法和对Java平台的无缝集成,受到了广泛欢迎。Spring框架与Groovy的...
IntelliJ IDEA作为强大的Java集成开发环境,配合构建工具Gradle,可以极大地提高开发效率。本文将详细介绍如何使用IntelliJ IDEA 2016和Gradle搭建一个完整的SSM(Spring、SpringMVC、MyBatis)项目,并添加MyBatis ...
这个框架集合提供了强大的服务层、控制层和数据访问层的解决方案。在现代Web应用中,经常需要与前端交互,返回JSON数据进行数据传输。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和...
至于**自选语言**,这可能意味着项目中允许开发者根据个人或团队的喜好选择编程语言,尽管SSH框架主要是与Java相关的,但可以选择JavaScript、Groovy或其他支持JVM的语言进行开发。 在实际开发中,"Struts2+...
在Java Web开发领域,Spring、Hibernate和...但是,随着技术的发展,Spring Boot和Spring Data JPA等新工具的出现,使得这样的传统整合方式逐渐减少,但理解这种整合方式对于深入理解Java Web开发仍然是很有帮助的。
函数式编程在Groovy中也得到了很好的支持,如列表和映射的操作。Groovy的列表支持链式操作,如`list.each{println it}`,这会遍历列表并对每个元素执行指定的操作。映射可以通过键值对进行操作,如`map.each{k, v ->...
Spring3.1.1在Spring3.x系列中是一个稳定的版本,它引入了Groovy支持、配置元数据的合并、简化测试等新特性,使得开发者能够更加灵活和高效地构建应用。 Hibernate是一个对象关系映射(ORM)框架,它允许开发者使用...
它对Java EE、Spring框架、Groovy、Kotlin等语言和技术有很好的支持。IDEA的智能代码提示、调试工具、版本控制集成等功能,极大地提升了开发效率。 在该项目中,开发人员可能使用了Maven或Gradle作为构建工具,管理...
Spring 3.0.2是在2010年发布的一个稳定版本,引入了许多新特性,如支持JSR-303 Bean Validation,改进了对RESTful服务的支持,以及对Groovy等动态语言的增强。 在压缩包子文件的文件名称列表中,我们看到: 1. ...
Spring 4是其一个较新的版本,它引入了对Java 8的支持,增强了对WebSocket的处理,以及改进了对Groovy和SpEL(Spring Expression Language)的集成。此外,Spring 4还提升了与JPA(Java Persistence API)和其他ORM...