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进行封装,使之能在项目中简单调用。