当前位置: 首页 > 知识库问答 >
问题:

立即执行spring-aop:@afterreturning

寇靖
2023-03-14

嗨,我正在使用Spring AOP进行日志记录,我有以下两个方面@before和@afterreturn,不幸的是,这两个方面都打印相同的响应,这里的期望是@before打印方法输入和@afterreturning打印方法输出。

 @Before(value ="execution(* com.abc.xyz.service..*(..))")
    fun logBeforeAllMethods(joinPoint: JoinPoint) {
        log.info("Service Request : " + Arrays.toString(joinPoint.args))
    }

    @AfterReturning(value="execution(* com.abc.xyz.service..*(..))")
    fun logAfterAllMethods(joinPoint: JoinPoint) {
        log.info("Service Response : " + Arrays.toString(joinPoint.args))
    }

共有1个答案

曾德水
2023-03-14

这并不奇怪,如果您告诉它们打印相同的建议方法。在这两种情况下,您都表示希望打印方法参数。你哪里也没有说结果应该打印出来。通过@afterreturn注释中的可选return参数来实现此操作。

也许你想检查一下Spring手册,这里有一个你想做什么的例子(甚至可以在Kotlin中找到!)。

@Aspect
class AfterReturningExample {
  @AfterReturning(
    pointcut = "com.xyz.myapp.CommonPointcuts.dataAccessOperation()",
    returning = "retVal")
  fun doAccessCheck(retVal: Any) {
      // ...
  }
}

当然,如果在建议中需要joinpoint和return值,您也可以将两者绑定到方法参数。

 类似资料:
  • 问题内容: 和之间有什么区别 ? 问题答案: 从根本上说,它们执行相同的操作,这是提供一种在PL / SQL中执行DDL语句的机制,这是本机不支持的。如果内存对我有用,那么在Oracle 7版本的DBMS_UTILITY软件包中可以使用EXEC_DDL_STATEMENT,而在8中仅引入本机动态SQL(EXECUTE IMMEDIATE)。 有一些区别。EXECUTEIMMEDIATE主要是关于执

  • 问题内容: 如何从此代码获得结果 通过 for循环 通常的方法是这样的 问题答案: 如果您 确实 需要 动态表名 ,那么我可能会选择 记录 类型: 结果集的 类型(它是一个 记录 数组): 执行选择并返回 结果集 实例的函数: 然后,该函数可以与类似的东西一起使用:

  • 我在下面的查询中遇到了一个错误,它给出了一个符号(在使用循环的行中)。我正在尝试开发一个函数,该函数将动态参数作为表名、列名、表id,并用于其他表。

  • (1)和(2)两个执行标记的不同含义是什么?

  • 主要内容:1.执行入口,2.进入拦截器责任链,3.执行顺序1.执行入口 调用了 方法 这个方法得到一个拦截器链, 是5个增强器封装成MethodInterceptor 然后 mi.proceed() 方法触发拦截器链的方法。 最后的一个方法进入了 , 进入了拦截器的责任链 2.进入拦截器责任链 ReflectiveMethodInvocation.proceed() -> ExposeInvocationInterceptor.invoke(mi) ->

  • 我试图实现一个简单的Spring AOP(v4)示例,使用建议和一个原位切入点表达式,但是没有调用方面方法。我有所有必需的依赖关系(spring-aop、aopalliance和aspectweaver)。我做错了什么? 方面: