拦截Grails中的所有自定义类

时间:2012-06-19 12:48:36

标签: grails groovy metaprogramming aop

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

元编程/ AOP?

1 个答案:

答案 0 :(得分:3)

使用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构建器

中使用

[2]方法签名模式。这个将匹配my.basepkg或subpackage

中任何类的任何方法

[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,它很简单)。