groovy是一种动态脚本语言,适用于一些可变、和规则配置性的需求,目前Spring提供ScriptSource接口,支持两种类型,一种是
ResourceScriptSource,另一种是 StaticScriptSource,但是有的场景我们需要把groovy代码放进DB中,所以我们需要扩展这个。
ResourceScriptSource:在 resources 下面写groovy类
StaticScriptSource:把groovy类代码放进XML里
DatabaseScriptSource:把groovy类代码放进数据库中
工程模块为:
ResourceScriptSource
groovy的pom
1 2 3 4 5 6 |
|
HelloService接口
1 2 3 4 5 6 7 8 9 10 |
|
resources下面建groovy实现类
1 2 3 4 5 6 7 8 9 10 11 |
|
在spring-groovy.xml中配置
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
主类 GroovyResourceApplication
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
启动并测试
StaticScriptSource
groovy的pom
1 2 3 4 5 6 |
|
HelloService接口
1 2 3 4 5 6 7 8 9 10 |
|
在spring-groovy.xml中配置具体的实现类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
|
主类 GroovyStaticscriptApplication
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
启动并测试
DatabaseScriptSource
下面我们先建表,把基本工作做完,这里我使用mybatisplus,dao、service等代码省略
1 2 3 4 5 6 7 8 9 10 |
|
1 |
|
方法一:
1、实时读取DB里的groovy脚本文件
2、利用GroovyClassLoader去编译脚本文件
3、把class对象注入成Spring bean
4、反射调用脚本的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
|
启动测试结果为:
总结:
优点:实时读取DB里的脚本,当脚本更改时,可以直接修改DB,对代码无侵入
缺点:每次都要查询DB,反射调用代码写死了
方法二:
1、我们模仿groovy-resource的思路,resource的XML配置是下面这样的
1 |
|
所以,我们可以把DatabaseScriptSource的XML保存成这种格式
1 |
|
2、然后模仿Spring保存成XML格式的document的思路,我们也把groovy保存成XML格式的document,放进内存里
3、groovy的关键处理类是ScriptFactoryPostProcessor,当 Spring 装载应用程序上下文时,它首先创建工厂 bean(例如 GroovyScriptFactory bean)。然后,执行ScriptFactoryPostProcessor bean,用实际的脚本对象替换所有的工厂 bean。例如,我们本次测试的配置产生一个名为 helloService 的 bean,它的类型是groovierspring.GroovyHelloService。(如果启用 Spring 中的 debug 级日志记录,并观察应用程序上下文的启动,将会看到 Spring 首先创建一个名为 scriptFactory.helloService 的工厂 bean,然后 ScriptFactoryPostProcessor 从该工厂 bean 创建 helloService bean)。