本例中,我们会使用GroovyClassLoader来加载groovy脚本。
GroovyClassLoader是一个定制的类装载器,负责解释加载Java类中用到的Groovy类。它也能编译。清单2.21展示了如何使用GroovyClassLoader加载Groovy类并且调用该类的一个方法。
@Component
public class AccessComputeService {
public static final Logger logger = LoggerFactory.getLogger(AccessComputeService.class);
private static GroovyClassLoader loader;
private static final ConcurrentHashMap<String,GroovyObject> groovyObjects = new ConcurrentHashMap<>();
static {
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
loader = new GroovyClassLoader(AccessComputeService.class.getClassLoader());
try {
//适配读取classpath下面的*.groovy文件列表
Resource[] resources = resolver.getResources("classpath:accessScore/*.groovy");
if(resources==null || resources.length==0){
logger.warn("未获取到groovy文件");
}else{
for (Resource resource: resources) {
try ( InputStream inputStream = AccessComputeService.class.getClassLoader().getResourceAsStream("accessScore/" + resource.getFilename())){
logger.info("加载准入评分groovy脚本:{}", resource.getFilename());
String text = CharStreams.toString(new InputStreamReader(inputStream, "UTF-8"));
Class groovyClass = loader.parseClass(text,resource.getFilename());
GroovyObject scriptInstance = (GroovyObject)groovyClass.newInstance();
groovyObjects.put(resource.getFilename().split("\\.")[0],scriptInstance);
}
}
}
} catch (Exception e) {
logger.error("groovy 引擎初始化失败!!!!!!!!",e);
}
}
public void execute(String scriptFileName, String scriptFunctionName, Map<String, Object> dataMap) {
//scriptFileName:文件名,scriptFunctionName:文件的方法,dataMap:参数
Strong result = (String)groovyObjects.get(scriptFileName).invokeMethod(scriptFunctionName, dataMap);
}
}
其他调用groovy的方式:
http://blog.csdn.net/eric_sunah/article/details/11541307