AOP与Grails

Jak*_*ila 5 java grails groovy aop spring

我想在Grails项目中创建自定义日志记录注释.

我的代码:

class MyService{
    @AuditLog
    def method1() {
        println "method1 called"
        method2()
    }
    @AuditLog
    def method2() {
        println "method2 called"
    }
}
Run Code Online (Sandbox Code Playgroud)

拦截器:

class AuditLogInterceptor implements MethodInterceptor {
    @Override
    Object invoke(MethodInvocation methodInvocation) throws Throwable {
        println "${methodInvocation.method}"
        return methodInvocation.proceed();
    }
}
Run Code Online (Sandbox Code Playgroud)

Spring配置:

aop {
    config("proxy-target-class": true) {
        pointcut(id: "auditLogInterceptorPointcut", expression: "@annotation(xxx.log.AuditLog)")
        advisor('pointcut-ref': "auditLogInterceptorPointcut", 'advice-ref': "auditLogInterceptor")
    }
}

auditLogInterceptor(AuditLogInterceptor) {}
Run Code Online (Sandbox Code Playgroud)

结果:

public java.lang.Object xxx.MyService.method1()
method1 called
method2 called
Run Code Online (Sandbox Code Playgroud)

我想看到方法2的注释火.我错过了什么?

dma*_*tro 8

发生这种情况是因为服务类中的内部方法调用不是在类的代理实例上完成的service.如果从应用程序上下文中获取服务bean并尝试调用method2(),则应该看到正在aspect监听advice.

class MyService{
    static transactional = false
    def grailsApplication

    @AuditLog
    def method1() {
        println "method1 called"
        grailsApplication.mainContext.myService.method2()
        //method2()
    }
    @AuditLog
    def method2() {
        println "method2 called"
    }
}
Run Code Online (Sandbox Code Playgroud)