springboot集成groovy

2025-06-20 00:42:30

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("&apos;", "'").replace("&quot;", "\"").replace("&gt;", ">").replace("&lt;", "<").replace("&nuot;", "\n").replace("&amp;", "&"); 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()); } }}结果如下:

springboot集成groovy

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.*;@Servicepublic 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("&apos;", "'").replace("&quot;", "\"").replace("&gt;", ">").replace("&lt;", "<").replace("&nuot;", "\n").replace("&amp;", "&"); 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. */@Servicepublic 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); }结果如下:

springboot集成groovy

8、从结果来看脚本编写很成功。

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢