拦截Grails中的所有自定义类

拦截Grails中的所有自定义类,grails,groovy,metaprogramming,aop,Grails,Groovy,Metaprogramming,Aop,我想监控在Grails应用程序执行期间访问了哪些类。为此,我考虑将日志记录添加到所有自定义类的“方法调用前”联合中,然后检查日志文件。 在不修改现有类的情况下添加此类拦截逻辑的最巧妙方法是什么 元编程/AOP?使用Spring AOP 要截获任何类上的任何方法,请将其添加到resources.groovy中的bean声明中: xmlns aop: "http://www.springframework.org/schema/aop" //[1] aop { config {

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

元编程/AOP?

使用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] 引入名称空间和模式,以便SpringAOP在BeanBuilder中使用

[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拦截器,它记录每个方法enter/exit/exception上的消息。您可以使用它或org.springframework.aop.interceptor包中的另一个,也可以编写自己的(只需扩展AbstractTraceInterceptor,很简单)。

使用groovy功能是一个解决方案。可能相关:@Fabiano,但这意味着修改现有代码(实现/重写)。我希望将逻辑外部化,并一次绑定到我的所有类。您可以使用expandoMetaclass在grails的引导过程中将invokeMethod和GetProperty添加到自定义类中,而无需接触类实现。这是一种有趣的方法,但这需要在开始时急切地加载所有可用的类。我想我的JVM不会高兴:)我有一个非常胖的应用程序…很抱歉你不得不自己回答这个问题,但我对这个问题很感兴趣。