我们正在为 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[])

看的评价(文件)函数:

 Object evaluate(File file) 

http://groovy.codehaus.org/api/groovy/lang /Script.html

我对我正在创建的领域特定语言做了一些研究。有以下三种可能:

  1. 创建继承父 Groovy 类的类。将您的共享代码放在基类中。

  2. 使用 ScriptBaseClass 参见 http://groovy.codehaus.org/Embedding+Groovy 。您的所有脚本都将在该类上创建。

  3. 使用导入静态方法功能。请注意,您可以在 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
.
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top