springboot集成groovy

2025-11-27 07:04:56

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.*;
@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("&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.
*/
@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);
   }

结果如下:

springboot集成groovy

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

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