首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Grails的AOP

使用Grails的AOP
EN

Stack Overflow用户
提问于 2013-07-02 01:13:36
回答 1查看 2.5K关注 0票数 5

我想在我的Grails项目中创建一个自定义的日志注释。

我的代码:

代码语言:javascript
运行
复制
class MyService{
    @AuditLog
    def method1() {
        println "method1 called"
        method2()
    }
    @AuditLog
    def method2() {
        println "method2 called"
    }
}

拦截器:

代码语言:javascript
运行
复制
class AuditLogInterceptor implements MethodInterceptor {
    @Override
    Object invoke(MethodInvocation methodInvocation) throws Throwable {
        println "${methodInvocation.method}"
        return methodInvocation.proceed();
    }
}

Spring配置:

代码语言:javascript
运行
复制
aop {
    config("proxy-target-class": true) {
        pointcut(id: "auditLogInterceptorPointcut", expression: "@annotation(xxx.log.AuditLog)")
        advisor('pointcut-ref': "auditLogInterceptorPointcut", 'advice-ref': "auditLogInterceptor")
    }
}

auditLogInterceptor(AuditLogInterceptor) {}

结果是:

代码语言:javascript
运行
复制
public java.lang.Object xxx.MyService.method1()
method1 called
method2 called

我也希望看到方法2的注解触发。我遗漏了什么?

EN

Stack Overflow用户

回答已采纳

发布于 2013-07-02 05:59:38

这是因为服务类中对self的内部方法调用是在service类的代理实例上而不是完成的。如果您从应用程序上下文获取服务bean并尝试调用method2(),您应该会看到aspect正在侦听advice

代码语言:javascript
运行
复制
class MyService{
    static transactional = false
    def grailsApplication

    @AuditLog
    def method1() {
        println "method1 called"
        grailsApplication.mainContext.myService.method2()
        //method2()
    }
    @AuditLog
    def method2() {
        println "method2 called"
    }
}
票数 8
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17410018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档