springboot集成groovy
1、引入groovy的包:
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.4.8</version>
</dependency>
2、测试一下引入的groovy包是否否能正常使用:
@Test
public void groovyTest() {
GroovyShell shell = new GroovyShell(new Binding());
Map<String, Object> vars = new HashMap<>();
vars.put("boData", "123");
setParameters(shell, vars);
String script = "return boData";
script = script.replace("'", "'").replace(""", "\"").replace(">", ">").replace("<", "<").replace("&nuot;", "\n").replace("&", "&");
Object rtn = shell.evaluate(script);
System.out.println(rtn);
}
private void setParameters(GroovyShell shell, Map<String, Object> vars) {
if(vars != null) {
Set<Map.Entry<String, Object>> set = vars.entrySet();
Iterator it = set.iterator();
while(it.hasNext()) {
Map.Entry<String, Object> entry = (Map.Entry)it.next();
shell.setVariable((String)entry.getKey(), entry.getValue());
}
}
}
结果如下:

3、从结果上看我们能够知道groovy是能正常使用的。
但是上面的方式过于简单,而且脚本里面我们无法使用spring容器中的bean,所以需要进行一次好的改造。
代码如下:
package cn.cy.core.groovy;
import cn.cy.util.BeanUtils;
import groovy.lang.GroovyShell;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Service;
import java.util.*;
@Service
public class GroovyScriptEngine implements BeanPostProcessor {
private Log logger = LogFactory.getLog(GroovyScriptEngine.class);
private GroovyBinding binding = new GroovyBinding();
private List<String> bindingInterface = Arrays.asList("cn.cy.service.IScriptService");
public GroovyScriptEngine() {
}
public List<String> getBindingInterface() {
return this.bindingInterface;
}
public void setBindingInterface(List<String> bindingInterface) {
this.bindingInterface = bindingInterface;
}
public void execute(String script) {
this.executeObject(script, (Map)null);
}
public void execute(String script, Map<String, Object> vars) {
this.executeObject(script, vars);
}
public boolean executeBoolean(String script, Map<String, Object> vars) {
return ((Boolean)this.executeObject(script, vars)).booleanValue();
}
public String executeString(String script, Map<String, Object> vars) {
return (String)this.executeObject(script, vars);
}
public int executeInt(String script, Map<String, Object> vars) {
return ((Integer)this.executeObject(script, vars)).intValue();
}
public float executeFloat(String script, Map<String, Object> vars) {
return ((Float)this.executeObject(script, vars)).floatValue();
}
public Object executeObject(String script, Map<String, Object> vars) {
this.binding.clearVariables();
this.logger.debug("执行脚本:" + script);
GroovyShell shell = new GroovyShell(this.binding);
this.setParameters(shell, vars);
script = script.replace("'", "'").replace(""", "\"").replace(">", ">").replace("<", "<").replace("&nuot;", "\n").replace("&", "&");
Object rtn = shell.evaluate(script);
return rtn;
}
private void setParameters(GroovyShell shell, Map<String, Object> vars) {
if(vars != null) {
Set<Map.Entry<String, Object>> set = vars.entrySet();
Iterator it = set.iterator();
while(it.hasNext()) {
Map.Entry<String, Object> entry = (Map.Entry)it.next();
shell.setVariable((String)entry.getKey(), entry.getValue());
}
}
}
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
List<Class<?>> list = new ArrayList();
Iterator var4 = this.bindingInterface.iterator();
while(var4.hasNext()) {
String str = (String)var4.next();
try {
Class<?> clazz = Class.forName(str);
list.add(clazz);
} catch (ClassNotFoundException var7) {
var7.printStackTrace();
this.logger.debug(var7.getException());
}
}
var4 = list.iterator();
while(var4.hasNext()) {
Class<?> clazz = (Class)var4.next();
boolean isImpl = BeanUtils.isInherit(bean.getClass(), clazz);
if(isImpl && isImpl) {
this.binding.setProperty(beanName, bean);
}
}
return bean;
}
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
}
4、package cn.cy.core.groovy;
import groovy.lang.Binding;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* Created by 30721 on 2019/9/11.
*/
public class GroovyBinding extends Binding {
private Map<?, ?> variables;
private static ThreadLocal<Map<String, Object>> localVars = new ThreadLocal();
private static Map<String, Object> propertyMap = new HashMap();
public GroovyBinding() {
}
public GroovyBinding(Map<String, Object> variables) {
localVars.set(variables);
}
public GroovyBinding(String[] args) {
this();
this.setVariable("args", args);
}
public Object getVariable(String name) {
Map<String, Object> map = (Map)localVars.get();
Object result = null;
if(map != null && map.containsKey(name)) {
result = map.get(name);
} else {
result = propertyMap.get(name);
}
return result;
}
public void setVariable(String name, Object value) {
if(localVars.get() == null) {
Map<String, Object> vars = new LinkedHashMap();
vars.put(name, value);
localVars.set(vars);
} else {
((Map)localVars.get()).put(name, value);
}
}
public Map<?, ?> getVariables() {
return (Map)(localVars.get() == null?new LinkedHashMap():(Map)localVars.get());
}
public void clearVariables() {
localVars.remove();
}
public Object getProperty(String property) {
return propertyMap.get(property);
}
public void setProperty(String property, Object newValue) {
propertyMap.put(property, newValue);
}
}
5、编写统一的接口,这个接口能够使实现该接口的类正常在脚本中实例化。
package cn.cy.service;
/**
* Created by 30721 on 2019/9/11.
*/
public interface IScriptService {
}
6、public class BeanUtils {
public static boolean isInherit(Class cls, Class parentClass) {
return parentClass.isAssignableFrom(cls);
}
}
7、测试一下脚本中含有bean和调用对象方法的例子:
package cn.cy.service;
import org.springframework.stereotype.Service;
/**
* Created by 30721 on 2019/9/11.
*/
@Service
public class GroovyTestService implements IScriptService{
public String getBoData(String str) {
System.out.println(str);
return str;
}
}
@Resource
private GroovyScriptEngine groovyScriptEngine;
@Test
public void groovyTest() {
Map<String, Object> vars = new HashMap<>();
vars.put("boData", "123");
String script = "return groovyTestService.getBoData(boData)";
Object rtn = groovyScriptEngine.executeObject(script, vars);
System.out.println(rtn);
}
结果如下:

8、从结果来看脚本编写很成功。
声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
阅读量:44
阅读量:107
阅读量:90
阅读量:41
阅读量:162