- Object[] getArgs:返回目标方法的参数
- Signature getSignature:返回目标方法的签名
- Object getTarget:返回被织入增强处理的目标对象
- Object getThis:返回AOP框架为目标对象生成的代理对象
* JoinPoint对象用于获取切面对象上下文信息,Aop将连接点的上下文信息封装为JoinPoint对象
* 通过JoinPoint对象可以获取到执行方法的相关信息,参数信息,代理对象的信息等。
* JoinPoint对象主要有以下几个方法
* getTarget():获取被代理的对象信息
* getThis():获取代理对象自己的信息
* getgetArgs():获取传入该方法的参数信息
* getSignature():获取执行方法的信息,通过该方法可以获取到方法名称,方法的类名和全类名,方法的声明类型等,如下
* getSignature().getName():获取方法名称
* getSignature().getModifiers():获取方法的声明类型
* getSignature().getDeclaringTypeName():获取执行方法所属类的类名
* getSignature().getDeclaringType().getSimpleName():取执行方法所属类的简单类名
*
* 其中:
* 环绕通知的参数为ProceedingJoinPoint,该对象是JoinPoint的子接口,新增了两个方法,proceed()和proceed(Object[] args)
* 在环绕通知中,可以直接通过proceed()方法获取到方法执行之后的返回结果。
* 并且在环绕通知中,必须调用proceed()方法来执行目标方法,否则会造成通知执行了,目标方法没执行。
* 总的来说,在环绕通知中,目标方法是否执行, 你可以理解为是否调用了proceed()方法。
* 环绕通知的方法需要返回目标方法执行之后的结果。如果你在环绕通知中没有调用proceed()方法获取目标方法的返回值结果,会报空指针。
* 如果你使用了proceed(Object[] args)这个方法,它会使用args作为新的参数去执行目标方法。
package com.dong.aspect; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.*; import org.junit.jupiter.api.parallel.Execution; import org.springframework.stereotype.Component; import java.lang.reflect.Array; import java.lang.reflect.Modifier; import java.util.Arrays; import java.util.List; @Aspect @Slf4j @Component public class Longger { @Pointcut(value = "execution(* com.dong.controller..*(..))") public void logger() { } /** * JoinPoint对象用于获取切面对象上下文信息,Aop将连接点的上下文信息封装为JoinPoint对象 * 通过JoinPoint对象可以获取到执行方法的相关信息,参数信息,代理对象的信息等。 * JoinPoint对象主要有以下几个方法 * getTarget():获取被代理的对象信息 * getThis():获取代理对象自己的信息 * getgetArgs():获取传入该方法的参数信息 * getSignature():获取执行方法的信息,通过该方法可以获取到方法名称,方法的类名和全类名,方法的声明类型等,如下 * getSignature().getName():获取方法名称 * getSignature().getModifiers():获取方法的声明类型 * getSignature().getDeclaringTypeName():获取执行方法所属类的类名 * getSignature().getDeclaringType().getSimpleName():取执行方法所属类的简单类名 * * 其中: * 环绕通知的参数为ProceedingJoinPoint,该对象是JoinPoint的子接口,新增了两个方法,proceed()和proceed(Object[] args) * 在环绕通知中,可以直接通过proceed()方法获取到方法执行之后的返回结果。 * 并且在环绕通知中,必须调用proceed()方法来执行目标方法,否则会造成通知执行了,目标方法没执行。 * 总的来说,在环绕通知中,目标方法是否执行, 你可以理解为是否调用了proceed()方法。 * 环绕通知的方法需要返回目标方法执行之后的结果。如果你在环绕通知中没有调用proceed()方法获取目标方法的返回值结果,会报空指针。 * 如果你使用了proceed(Object[] args)这个方法,它会使用args作为新的参数去执行目标方法。 */ @Before(value = "logger()") public void before(JoinPoint joinPoint) { log.info("前置通知,方法执行之前执行!"); Object target = joinPoint.getTarget(); Object aThis = joinPoint.getThis(); log.info("前置通知:被代理对象为:{}", target.toString()); log.info("前置通知:代理对象自己为:{}", aThis.toString()); String name = joinPoint.getSignature().getName(); log.info("前置通知:执行方法的名称为:{}", name); String declaringTypeName = joinPoint.getSignature().getDeclaringTypeName(); log.info("前置通知:执行方法的类名为:{}", declaringTypeName); String modifierType = Modifier.toString(joinPoint.getSignature().getModifiers()); log.info("前置通知:执行方法的声明类型为:{}", modifierType); Object[] args = joinPoint.getArgs(); List<Object> objects = Arrays.asList(args); log.info("前置通知:执行方法:{},接收到的参数为:{}", name,objects); log.info("前置通知结束!"); } @Around(value = "logger()") public Object after(ProceedingJoinPoint joinPoint) throws Throwable { log.info("环绕通知开始"); Long startTime=System.currentTimeMillis(); String name = joinPoint.getSignature().getName(); Object proceed = joinPoint.proceed(); String s = joinPoint.getSignature().toString(); log.info("环绕通知:{}方法的返回值为:{}",name,proceed.toString()); log.info("环绕通知:{}方法执行完毕,耗时{}ms!",name,System.currentTimeMillis()-startTime); log.info("环绕通知结束"); //需要返回joinPoint.proceed()的结果,否则会导致增强的方法执行了,而目标方法没有执行的问题。 return proceed; } @After(value = "logger()") public void after(JoinPoint joinPoint){ log.info("后置通知开始"); log.info("后置通知:{}方法执行结束",joinPoint.getSignature().getName()); log.info("后置通知开始"); } @AfterReturning(value = "logger()",returning = "result") public void afterReturning(JoinPoint joinPoint,Object result){ log.info("返回通知开始"); log.info("返回通知:{}方法执行结束,返回值为:>>>>>{}",joinPoint.getSignature().getName(),result.toString()); log.info("返回通知结束"); } @AfterThrowing(value = "logger()",throwing = "ex") public void afterThrowing(JoinPoint joinPoint,Exception ex){ log.info("异常通知开始"); log.info("异常通知:{}方法异常,异常信息为:{}",joinPoint.getSignature().getName(),ex); log.info("异常通知结束"); } }
https://blog.csdn.net/qq_44730730/article/details/134006899
标签:info,常用,joinPoint,log,JoinPoint,getSignature,方法,proceed From: https://www.cnblogs.com/isme-zjh/p/18105542