代码之家  ›  专栏  ›  技术社区  ›  Christopher Klewes

groovy是否提供include机制?

  •  7
  • Christopher Klewes  · 技术社区  · 15 年前

    我们正在寻找一种包含机制,让groovy脚本有空间处理横切问题。

    在我的示例中,Web服务端点作为groovy脚本,并希望登录到我们的Web服务协议。为此,我们使用隐式对象(从框架中获取)来创建日志语句。

    但如果我们在每个Web服务端点中对其进行编码,那么这就是样板代码。

    我们正在PHP中搜索include()之类的东西,包括其他的groovy脚本,有什么方法可以做到这一点吗?

    6 回复  |  直到 11 年前
        1
  •  1
  •   Dan    15 年前

    既然您已经提到了横切关注点,我说您需要拦截您的WebService调用 AOP 样式(不是包含机制)。

    颗粒完全与 Spring framework 因此,这为开发SpringAOP特性提供了一个很好的选择。从Grails官方指南中查看本章: http://grails.org/doc/latest/guide/14.%20Grails%20and%20Spring.html 搜索单词aop。

    也许有一个 purely groovy way 做AOP,但我会和Grails和Spring一起去。

        2
  •  10
  •   Anton Mamaenko    14 年前

    groovy将其文件视为对象(将其视为自动包装)。它使所有.java类路径中的Groovy文件作为类可用。因此,如果您有文件util.groovy,其中包含如下内容:

    def static AuxMethod() {
        return "Hello World"
    }
    

    要从另一个文件调用它,只需编写:

    println util.AuxMethod()
    

    就是这样。同样,只需确保您的util.groovy文件在类路径中。

        3
  •  2
  •   Blaine    13 年前

    调用脚本 u.groovy 从当前脚本,将原始参数传递给U.groovy,运行

    run(new File('u.groovy'), args)
    

    显然,您也可以发送任何想要的字符串参数:

    run(new File('u.groovy'),
            ['one', new File('two.text').absolutePath] as String[])
    
        4
  •  1
  •   Jonathan Holloway    15 年前

    查看evaluate(file)函数:

     Object evaluate(File file) 
    

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

        5
  •  1
  •   Paul Nelson    12 年前

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

    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
    .
    

    我不认为那太糟糕了。当然,这与添加某种包括预处理器语句差不多。

    最后,所有这些都假设您可以访问正在调用Groovy代码的Java程序。如果不是这样,您仍然可以使用静态导入。这只是一行额外的代码。

    import static com.mycompany.mycode.doCommonStuff
    doCommonStuf()
    .
    . do the rest of it here
    .