java - Grails 的 AOP

标签 java spring grails groovy aop

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

我的代码:

class MyService{
    @AuditLog
    def method1() {
        println "method1 called"
        method2()
    }
    @AuditLog
    def method2() {
        println "method2 called"
    }
}

拦截器:

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

Spring 配置:

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

auditLogInterceptor(AuditLogInterceptor) {}

结果:

public java.lang.Object xxx.MyService.method1()
method1 called
method2 called

我也希望看到方法 2 的注释触发。我错过了什么?

最佳答案

发生这种情况是因为服务类中对自身的内部方法调用service 的代理实例上完成类(class)。如果您从应用程序上下文中获取服务 bean 并尝试调用 method2()你应该看到 aspectadvice .

class MyService{
    static transactional = false
    def grailsApplication

    @AuditLog
    def method1() {
        println "method1 called"
        grailsApplication.mainContext.myService.method2()
        //method2()
    }
    @AuditLog
    def method2() {
        println "method2 called"
    }
}

关于java - Grails 的 AOP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17410018/

相关文章:

java - 如果只是为了搜索,是否值得将实体放在 @Transactional 服务层下?

java - Spring Data JPA 切片底层 SQL

java - jar 策略文件

java - 如何在我的 Java Web 应用程序中而不是在 servlet 上下文中获取当前登录的用户?

java - 如何使用Java获取两个日期之间的月份名称

java - 如何在版本 Maven 插件中隐藏继承的依赖项?

session - 如何在grails中实现cookie、用户跟踪?

grails - 是否可以强制 Grails/Gorm 在插入中不包含列?

hibernate - Grails域-具有多个父级联行为的子级

java - 无法正确构建具有正确运行条件的 do while 循环