spring项目中嵌入groovy脚本

网上搜java嵌入groovy有很多文章,一般是使用GroovyClassLoader来实现。 我们的项目嵌入groovy主要是用它作为事件处理程序使用类似简单的规则引擎,因为事件处理程序变动可能比较多,groovy脚本可以动态加载,脚本更新后,java部分只有重新重新加载,这样就运行最新的脚本了。
先看下我们需要的脚本格式:

导入包:

com.xxx.FooService
com.xxx.Context 

代码:

<!-- lang: groovy -->
@Autowired
FooService fooService

void handle(Context context) { 
    // 具体业务代码。。。
}

导入包类似java的 import。 Autowired是导入spring application context定义的bean。 代码里面的方法void handle(Context context) 是固定的,项目里面有个接口EventHandle,这个就是它的实现,这样后面我们根据groovy脚本动态的生成一个EventHandle接口的实现类。事件触发时调用的就是这个实现类。

整个过程是这样的:
读取 导入类,到一个String[](根据回车换行分割), 顺便添加关键字 import。 然后读取读取脚本:放到一个String script。

<!-- lang: java -->
GroovyClassLoader classLoader = new GroovyClassLoader(classLoader);
....
getEventHandleClass(..) {
    StringBuilder sb 
    sb.append("class ").append("EventHandle_").append("_").append(SEQ.incrementAndGet()).append(" implements EventHandle {\n");
        sb.append(script);
        sb.append("}\n");
        String text = sb.toString();
        return classLoader.parseClass(text);
}

这样就得到了一个类型为Class<EventHandle>的class对象。 然后就要得到类的实例:

<!-- lang: java -->
EventHandle handle = BeanUtils.instantiateClass(getEventHandleClass(..));
applicationContext.getAutowireCapableBeanFactory().autowireBean(handle);
return handle;

applicationContext autowireBean 是利用spring容器实现脚本里面的Autowired注入。
有了实例就可以直接调用了。 为了提高效率这个实例可以缓存,只是当脚本发生改变时才需要重新生成实例。

转载于:https://my.oschina.net/yybear/blog/168699

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值