首页 > 其他分享 >Groovy定义的Class在Spel中使用

Groovy定义的Class在Spel中使用

时间:2023-07-13 19:12:49浏览次数:51  
标签:Groovy String codeSource instance Spel static import new Class

@Resource
    private ICustomFunctionService customFunctionService;

    @PostConstruct
    private void init() {
        LambdaQueryWrapper<CustomFunctionEo> wrapper = Wrappers.lambdaQuery(CustomFunctionEo.class)
                .eq(CustomFunctionEo::getDr, 0);
        List<CustomFunctionEo> list = customFunctionService.getInnerService().list(wrapper);

        try {
            list.forEach(p -> {
                String function = p.getFunction();
                CustomFunctionFactory.getCodeSourceClass(function);
            });

         

            SpelParserConfiguration configuration = new SpelParserConfiguration(SpelCompilerMode.IMMEDIATE, CustomFunctionFactory.GroovyClassLoader);
            String _spelExpression = "T(com.g2.exchange.biz.service.auth.custom.AbcUtil).sign(null)";
            Map<String, Object> context = new HashMap<>();
            SpelExpressionParser spelParser = new SpelExpressionParser(configuration);
            StandardEvaluationContext spelContext = new StandardEvaluationContext(context);
// 重要的是下面这行代码, 将classLoader传给Spel
            spelContext.setTypeLocator(new StandardTypeLocator(CustomFunctionFactory.GroovyClassLoader));
            Expression spelExpression = spelParser.parseExpression(_spelExpression);

            Object v = spelExpression.getValue(spelContext);
            System.out.println(v);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

 

import groovy.lang.GroovyClassLoader;

import java.math.BigInteger;
import java.security.MessageDigest;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

public class CustomFunctionFactory {
    public static GroovyClassLoader GroovyClassLoader = new GroovyClassLoader(CustomFunctionFactory.class.getClassLoader());
    private static ConcurrentMap<String, Class<?>> CUSTOM_CLASS_CACHE = new ConcurrentHashMap<>();

    private static ConcurrentMap<String, Object> CUSTOM_CLASS_INSTANCE_CACHE = new ConcurrentHashMap<>();

    private static String getKey(String codeSource) {
        try {
            byte[] md5 = MessageDigest.getInstance("MD5").digest(codeSource.getBytes());
            return new BigInteger(1, md5).toString(16);
        } catch (Exception ex) {
            throw new BizException("md5异常");
        }
    }

    public static <T> T getInstance(String codeSource, Class<T> tClass) {
        String key = getKey(codeSource);
        Object instance = CUSTOM_CLASS_INSTANCE_CACHE.get(key);
        if (instance != null) {
            return (T) instance;
        }
        synchronized (CustomFunctionFactory.class) {
            instance = CUSTOM_CLASS_INSTANCE_CACHE.get(key);
            if (instance != null) {
                return (T) instance;
            }
            try {
                instance = generateInstance(codeSource, tClass);
                CUSTOM_CLASS_INSTANCE_CACHE.put(key, instance);
                return (T) instance;
            } catch (Exception ex) {
                ex.printStackTrace();
                throw new RuntimeException(ex.getMessage());
            }
        }
    }

    private static <T> T generateInstance(String codeSource, Class<T> tClass) throws Exception {
        if (codeSource != null && codeSource.trim().length() > 0) {
            Class<?> clazz = getCodeSourceClass(codeSource);
            if (clazz != null) {
                Object instance = clazz.newInstance();
                if (instance != null) {
                    if (tClass.isAssignableFrom(instance.getClass())) {
                        return (T) instance;
                    } else {
                        throw new IllegalArgumentException(">>>>>>>>>>> xxl-glue, loadNewInstance error, "
                                + "cannot convert from instance[" + instance.getClass() + "] to IJobHandler");
                    }
                }
            }
        }
        throw new IllegalArgumentException(">>>>>>>>>>> xxl-glue, loadNewInstance error, instance is null");
    }

    public static synchronized Class<?> getCodeSourceClass(String codeSource) {
        try {
            String md5Str = getKey(codeSource);

            Class<?> clazz = CUSTOM_CLASS_CACHE.get(md5Str);
            if (clazz == null) {
                clazz = GroovyClassLoader.parseClass(codeSource);
                CUSTOM_CLASS_CACHE.putIfAbsent(md5Str, clazz);
            }
            return clazz;
        } catch (Exception e) {
            return GroovyClassLoader.parseClass(codeSource);
        }
    }
}

 

        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-all</artifactId>
            <version>2.4.19</version>
        </dependency>

 

AbcUtil的代码放在数据库里

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.Map;


/**
 * 不要使用,这只是 一个示例
 */
public class AbcUtil   {
    private static final Logger log = LoggerFactory.getLogger(AbcUtil.class);

    public static String sign(String[] args) throws Exception {
         return "aaa";
    }
}

 

标签:Groovy,String,codeSource,instance,Spel,static,import,new,Class
From: https://www.cnblogs.com/zhshlimi/p/17551828.html

相关文章

  • SpEL (Spring Expression Language)
    https://docs.spring.io/spring-framework/docs/3.0.x/reference/expressions.html 6.1 IntroductionTheSpringExpressionLanguage(SpELforshort)isapowerfulexpressionlanguagethatsupportsqueryingandmanipulatinganobjectgraphatruntime.T......
  • js 原型链 & class
    https://es6.ruanyifeng.com/#docs/class 早期采用原型链写法functionA(){this.fx1=1}A.prototype.add=function(x){this.fx1+=1;console.log(x,this.fx1)}A.prototype.ts=function(x){console.log(x,this.fx1)this.add()c......
  • defined in class path resource [de/codecentric/boot/admin/server/config/AdminSe
    搭建springbootadmin监控时出现的,经排查是版本过低,换个高版本的,顺利进入网页界面<dependency><groupId>de.codecentric</groupId><artifactId>spring-boot-admin-starter-server</artifactId><version>2.7.10</version......
  • @IdClass 注解和@Id JPA联合主键和注意事项
    @IdClass注解和@IdJPA联合主键原文链接:https://www.hxstrive.com/subject/open_jpa/538.htm前面章节已经介绍了@Id注解,该注解定义实体类中某个属性为数据库的主键,一个实体里面必须有一个主键。本章节将介绍@IdClass注解,该注解用来为某个实体指定复合主键,复合主键存放在......
  • Jmeter(一)使用Jmeter导入jmx文件时,报CannotResolveClassException错误
    报CannotResolveClassException错误错误的解决办法:ProblemloadingXMLfrom:‘xxx.jmx’.Cause:CannotResolveClassException:kg.apc.jmeter.threads.SteppingThreadGroupDetail:com.thoughtworks.xstream.converters.ConversionException:----Debugginginformation----caus......
  • Scala连接Hbase集群出现异常tried to access method com.google.common.base.Stopwatc
    总结/朱季谦在新项目上创建以下Scala代码去连接Hbase集群,用来判断Hbase是否存在某张表。//离线Hbasevalconf:Configuration=HBaseConfiguration.create()conf.set("hbase.zookeeper.quorum","192.168.1.200")conf.set("hbase.zookeeper.property.clientPort","2181&......
  • go语言:没有class
    参考:视频链接没有classgo语言没有class,但是可以将方法可以被关联到你声明的struct类型,如下介绍了如何将方法关联到类型和构造函数:packagemainimport("fmt")//矩形结构体typeRectanglestruct{LengthintWidthint}//计算矩形面积func(r*Rect......
  • 【Scala】在IDEA中右键没有添加scala object和class的选项
    首先要确保在AddFrameworkSupprt中添加了scala(选中项目根目录) 然后在File->ProjectStructure...中选择Libraries   最后是关键,要选择SourceRoot文件夹上级目录,一般是xxx.main  在sourceroot文件夹上右击,New里就有了ScalaClass ......
  • this version of the Java Runtime only recognizes class file versions up to 55.0
    问题:  运行SpringBootdemo时报错: thisversionoftheJavaRuntimeonlyrecognizesclassfileversionsupto55.0at原因:   编译版本和运行版本不一致,具体原因是编译版本高于运行版本,SpringBootdemo中使用的是jdk17,我本地的jdk是11 解决:  调整idea中的jd......
  • java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderL
    java.lang.ClassNotFoundException:org.springframework.web.context.ContextLoaderListener类没有找到 解决:file--properties--选择Deployment Assembly --再点击右边的Add按钮--选择JavaBuildPathEntries--点击Next按钮--选择你的MavenDependencies......