【问题标题】:Intercepting all custom classes in Grails拦截 Grails 中的所有自定义类
【发布时间】:2012-06-21 12:15:36
【问题描述】:

我想监控在 Grails 应用程序执行期间访问了我的哪些类。为此,我正在考虑将日志记录添加到所有自定义类的“方法调用之前”联合中,然后检查日志文件。 在不修改现有类的情况下添加此类拦截逻辑的最巧妙方法是什么?

元编程/AOP?

【问题讨论】:

  • 一个解决方案是使用 groovy invokeMethod and getProperty 功能。
  • @Fabiano 但这意味着修改现有代码(实现/覆盖)。我希望将逻辑外部化并一次绑定到我的所有类。
  • 您可以使用expandoMetaclass 在grails 的引导程序中为您的自定义类添加invokeMethod 和getPropery,而无需实现touch che 类。 take a look here
  • 有趣的方法,但这需要在开始时急切地加载所有可用的类。我认为我的 JVM 不会高兴 :) 我有一个非常胖的应用程序......

标签: grails groovy metaprogramming aop


【解决方案1】:

使用 Spring AOP。

要拦截你想要的任何类的任何方法,请将其添加到 resources.groovy 中的 bean 声明中:

xmlns aop: "http://www.springframework.org/schema/aop" //[1]

aop {
    config {
        pointcut(id: "interceptorPointcut", expression: "execution(* my.basepkg..*(..))") //[2]
        advisor('pointcut-ref': "interceptorPointcut", 'advice-ref': "myInterceptor") //[3]
    }
}

myInterceptor(org.springframework.aop.interceptor.SimpleTraceInterceptor) { //[4]
   loggerName = "myTracer"
}

[1] 为 Spring AOP 引入命名空间和模式以在 bean builder 中使用

[2] 方法签名模式。这将匹配 my.basepkg 或子包中任何类中的任何方法

[3] 绑定切入点和建议

[4] 通知 bean 声明以及将用于记录拦截器消息的覆盖 loggerName。添加到 Config.groovy 中,如下所示:

appenders {
    rollingFile maxBackupIndex: 5, maxFileSize: '100KB', name: 'fileTracer', file: 'methodtrace.log', layout: pattern(conversionPattern: "%m%n")
}
trace additivity: false, fileTracer: 'myTracer'

SimpleInterceptor 是一个标准的 Spring 拦截器,它记录每个方法进入/退出/异常的消息。您可以使用它或 org.springframework.aop.interceptor 包中的另一个,或编写自己的(只需扩展 AbstractTraceInterceptor,很简单)。

【讨论】:

  • 很抱歉,您必须自己回答这个问题,但我对这个问题很感兴趣。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
  • 2018-05-25
相关资源
最近更新 更多