groovy 提供包含机制吗?
-
13-09-2019 - |
题
我们正在为 Groovy 脚本寻找一种包含机制,以便为横切关注点留出空间。
在我的示例中,我们将 Web 服务端点作为 groovy 脚本,并希望登录到我们的 Web 服务协议。为此,我们使用隐式对象(从我们的框架获取)来创建日志记录语句。
但如果我们在每个 Web 服务端点中编码,这就是样板代码。
我们正在 php 中搜索类似 include() 的内容,其中包括其他 groovy 脚本,有什么想法可以做到这一点吗?
解决方案
既然你已经提到的“跨部门,关注”我说,你需要拦截您的Web服务调用的 AOP 样式(不是包括机构)。
Grails是完全 Spring框架集成,所以这使得对于利用Spring AOP的功能一个不错的选择。看看从Grails的官方指南本章在: http://grails.org/doc/latest/guide /14.%20Grails%20and%20Spring.html 和搜索字AOP。
也许有一个纯粹常规做AOP的方式,但我倒是去Grails和弹簧。
其他提示
的Groovy对待其文件作为对象(认为它作为自动包装的)。它使得可以作为类的Java类路径中的所有.groovy文件。所以,如果你有文件util.groovy,包含像这里面的:
def static AuxMethod() {
return "Hello World"
}
要从另一个文件中你只写称呼它:
println util.AuxMethod()
就是这样。同样,只要确保你的util.groovy文件是在类路径中。
要从当前脚本调用脚本u.groovy
,沿原参数传递到u.groovy,运行
run(new File('u.groovy'), args)
当然,你也可以发送任何字符串参数要:
run(new File('u.groovy'),
['one', new File('two.text').absolutePath] as String[])
我对我正在创建的领域特定语言做了一些研究。有以下三种可能:
创建继承父 Groovy 类的类。将您的共享代码放在基类中。
使用 ScriptBaseClass 参见 http://groovy.codehaus.org/Embedding+Groovy 。您的所有脚本都将在该类上创建。
使用导入静态方法功能。请注意,您可以在 java 容器内执行此操作(请参阅 http://mrhaki.blogspot.com/2011/06/groovy-goodness-add-imports.html ).
所有这些都很好用。我的偏好是 ScriptBaseClass。如果公共代码是 Groovy(ScriptBaseClass 必须 成为一个时髦的班级。它不能是 java 类。)
当然,对于所有这些项目,您仍然需要在 Groovy 代码中实际调用通用方法。例如:
doCommonStuff();
.
. do the rest of it here
.
我不认为那太可怕了。当然,与添加某种 #include 预处理器语句大致相同。
最后,所有这些都假设您可以访问调用 Groovy 代码的 java 程序。如果不是这种情况,您仍然可以使用静态导入。这只是多一行代码。
import static com.mycompany.mycode.doCommonStuff
doCommonStuf()
.
. do the rest of it here
.