Groovy语言学习--语法基础(4)
语法基础到此就结束了,毕竟其和Java许多地方并无差别。groovy作为脚本,是为了能更好地随业务变化调整规则,我根据自己对规则的理解
通过一张图简单描述一个groovy脚本场景:由于货币膨胀,经济收缩等未来一年的报价策略是变动的而且是未知的,可能到2019年的时候我们需要重新
写一个报价策略在代码中维护,为了不变更项目代码和服务停机等故障,通常我们会写一个规则引擎,当然我们也可以通过groovy脚本来织入新的策略,
有点像spring aop,所以groovy就是一把利器。
语法基础Demo,简述java织入groovy脚本的四种方式。
新建maven项目,项目结构如下:

引入对应的maven依赖:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>slow</groupId>
<artifactId>city</artifactId>
<version>0.0.1-SNAPSHOT</version> <name>city</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-core</artifactId>
</dependency> <dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.4.10</version>
</dependency> </dependencies> <build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven
defaults (may be moved to parent pom) -->
<plugins>
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.7.1</version>
</plugin>
<plugin>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
在Java中集成Groovy应用的四种方式:GroovyShell GroovyScriptEngine GroovyClassLoader JavaApi
import groovy.lang.Binding;
import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyObject;
import groovy.lang.GroovyShell;
import groovy.util.GroovyScriptEngine; import java.io.File; import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager; import org.jboss.logging.Logger; public class GroovyJavaExample { Logger log = Logger.getLogger(getClass());
/*
* GroovyShell
*/
public String groovySheel() {
Binding binding = new Binding();
binding.setVariable("name", "Tom");
binding.setVariable("age", 16);
binding.setProperty("favourite", "play paino");
GroovyShell shell = new GroovyShell(binding);
String script = "println \"welcome to $name ;age is $age;favourite is $favourite \"; return favourite";
Object value = shell.evaluate(script);
log.info("value:" + value);
return value.toString();
} /*
* GroovyScriptEngine
*/
public String groovyScriptEngineExample() {
String result = "";
try {
// 定义groovy脚本引擎的根路径
String[] roots = new String[] { ".\\src\\main\\groovyscript" };
GroovyScriptEngine engine = new GroovyScriptEngine(roots); Binding binding = new Binding();
binding.setVariable("language", "groovy");
// script.groovy 脚本引擎根路径下的 脚本名
Object value = engine.run("script.groovy", binding);
log.info("value:" + value);
result = value.toString();
} catch (Exception e) {
log.error(e);
}
return result;
} @SuppressWarnings({ "rawtypes" })
public String groovyClassLoader() {
GroovyClassLoader loader = null;
try {
loader = new GroovyClassLoader();
String groovyFilePath = "E:/workspace-eclipse/city/src/main/groovyscript/groovy1.groovy";
Class groovyClass = loader.parseClass(new File(groovyFilePath));
GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance();
String result = (String) groovyObject.invokeMethod("fun", "你好"); log.info("groovy 脚本返回的结果:" + result); loader.close();
} catch (Exception e) {
log.error(e);
}
return null;
} /*
* java specification request 223 ScriptEngine接口
*/
public String jsrApi() {
String result = "";
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("groovy");
String helloLanguage = "def hello(language){return \"hello $language\"}";
try {
engine.eval(helloLanguage); Invocable inv = (Invocable) engine;
Object[] params = {"Groovy"};
Object value = inv.invokeFunction("hello", params);
log.info("value: " + value);
result = value.toString();
} catch (Exception e) {
log.error(e);
}
return result;
}
}
相关的groovy脚本
groovy1.groovy
println "hello groovy script"
def String fun(String args){
println args
return "hello lover"
}
loaderScript.groovy
package slow.city
class LoaderScript {
public createFile(String fileName){
File file = new File(fileName);
file.createNewFile();
}
}
script.groovy
package slow.city
println "welcome to ${}"
return "are you ok"
代码比较简单,必要的地方已经附加了相应的解释。在实际的项目生产中,把groovy代码直接存储到数据库中,通过对数据库groovy脚本内容的更改,
进而变更相对应的规则。大概图示如下。后续想着如何对groovy进行封装,使之能在项目中简单调用。





Groovy语言学习--语法基础(4)的更多相关文章
- Groovy语言学习--语法基础(5)
至此groovy语言学习-语法基础就结束了,新的工作已经安排下来,要干活了. 对groovy了解到一定程度之后就可以在java项目中对其进行引入了.为此新建了一个微型的项目,个人觉得千言万语不如代码实 ...
- Groovy语言学习--语法基础(1)
2018年11月末,从上家公司离职后进入现在的公司.进入项目以来,发现项目中有很多groovy脚本,以前没接触过groovy,抽时间系统地学一下,也方便后期项目的开发和维护. groovy和java的 ...
- Groovy语言学习--语法基础(3)
侧重点可能是groovy metaClass基元类的概念,有点像java的反射,因为java反射目前基本也没研究过,就mark一下,后续若有用到就深入研究一下. 基础语法的东西貌似差不多八九不离十了, ...
- Groovy语言学习--语法基础(2)
集合和闭包 因为之前没接触过C++等,对指针也一窍不通.个人不成熟的了解 闭包是一种数据类型,可以很方便的执行一段独立的代码 简化方法的调用 package groovy /** * Groovy容器 ...
- c语言学习之基础知识点介绍(三):scanf函数
本节继续介绍c语言的基础知识点. scanf函数:用来接收用户输入的数据. 语法:scanf("格式化控制符",地址列表); 取地址要用到取地址符:&(shift+7) 例 ...
- oc语言学习之基础知识点介绍(五):OC进阶
一.点语法介绍 /* 以前封装后,要给属性赋值,必须调用方法 这样做,有两个缺点: 1.代码量多,调用方法要写的东西多. 2.看起来并不像是给属性赋值,也不像取值. 我们用点语法就可以更好的解决! 点 ...
- oc语言学习之基础知识点介绍(四):方法的重写、多态以及self、super的介绍
一.方法重写 /* 重写:当子类继承了父类的方法时,如果觉得父类的方法不适合,那么可以对这个方法进行重新实现,那么这个就重写. 注意:也就是说,一定只能发生在父类和子类关系中. 然后是子类重新实现父类 ...
- oc语言学习之基础知识点介绍(二):类和对象的进一步介绍
一.类.对象在内存中的存储 /* 内存分区: 栈:局部变量 堆:程序员自己写代码申请开辟的 程序员自己维护,编译器现在帮我们自动优化了,它在合适的给我们加上了释放空间的语句,所以我们现在写的对象不会造 ...
- oc语言学习之基础知识点介绍(一):OC介绍
一.第一个OC程序 #import <Foundation/Foundation.h> //导入头文件 int main(int argc, const char * argv[]) ...
随机推荐
- Scrapy 解决Scrapy安装时报错"Microsoft Visual C++ 14.0 is required"
问题描述 当前环境win10,python_3.6.1,64位.在windows下,在dos中运行pip install Scrapy报错:error: Microsoft Visual C++ 14 ...
- 关于正餐智能POS6.0.1.1改版后,点击反结账进入点菜界面后无法进行加菜的FAQ
适用版本:智能POS正餐V6.0.1.1+适用情况:点击反结账进入点菜界面后无法进行加菜.原因:为让报表统计的数据更准确解决方案:1.点击反结账,输入用户密码,进入点菜界面. 2.点击结算,进入收银台 ...
- Spark WordCount 文档词频计数
一.使用数据 Apache Spark is a fast and general-purpose cluster computing system.It provides high-level AP ...
- Linux中shell和子shell一点点理解
Linux执行脚本有两种方式,主要区别在于是否建立子shell 1.像sh,bash,./命令是用来执行shell脚本的,在bash/sh命令下,脚本文件可以无"执行权限",即 ...
- 基于WIN8.1:新手篇→tomcat安装配置
一.JDK配置 下载安装JDK和tomcat 打开电脑属性,高级系统设置进行环境变量配置 新建系统变量,变量值为JDK安装路径,并在系统变量path最后加上“%JAVA_HOME%\bin;%JAVA ...
- 文件上传漏洞靶场:upload-labs安装及第一关教程
注:本文仅供学习使用,请勿用于非法操作,后果与作者无关!!! 一.简介 upload-labs是一个使用php语言编写的,专门收集渗透测试过程中遇到的各种上传漏洞的靶场.旨在帮助大家对上传漏洞有一个全 ...
- Linux 小知识翻译 - 「GCC」
这次聊聊「GCC」. GCC是「GNU Compiler Collection」的简称,由C.C++.FORTRAN.Java等语言的编译器以及这些语言的库所组成. GCC不仅包含编译器本身,还包含了 ...
- C语言 大小写字母转换
//凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 方法1: #include<stdio.h> #include<stdlib.h> ...
- ubuntu下配置rsync,实现远程备份
rysnc(remote synchronize)在CentOS系统默认安装在/usr/bin,此外rysnc在windows平台下也有相应版本.主页地址为: http://rsync.samba.o ...
- js开发打印证书功能(二)
在上一篇的基础上,实现了一下另外一种方式. 上一篇地址:https://www.cnblogs.com/ljwsyt/p/9525290.html 首先,该方式也是有几种方法. 1.在上一篇的基础上, ...