springboot集成groovy

2025-11-08 23:27:37

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。
猜你喜欢