AOP概念名词:
通知(advice)
在已存在的业务方法的前、后、异常、最终处加入的方法。
切面(aspect)
通知advice 方法所在的类,一个 aspect 类中可以有多个通知方法。
连接点(joinPoint)
已存在的业务方法。
切入点(pointCut)
joinPoint的集合。(为要添加advice的方法划定范围。)
目标对象(target)``
joinPoint方法所在的对象。
织入(Weave)``
把advice方法放在joinPoint的前、后、异常、最终处。(只有织入后,advice才会有效。)
Spring 几种增强通知顺序:
正常情况
异常情况
多个切面的情况
SprinBoot 2.3.4.RELEASE之前的版本@Around在@After之前,SprinBoot 2.3.4.RELEASE版本之后,@Around执行在了@After之后。
重点环绕通知
@Around
环绕通知就是,包括所有通知。环绕通知很强大,但不常用,通常我们只需要用到其中一两项通知。环绕通知的返回值必须是Object,形参必须是ProceedingJoingPoint。
@Component
@Aspect
public class DemoAspect {
//配置切入点
@Pointcut("execution(* com.aop.service.*.*(..))")
public void myPointCut() {}
//环绕通知
@Around("myPointCut()")
public Object aroundAdvice(ProceedingJoinPoint proceeding) {
//和JoinPoint一样,ProceedingJoinPoint也可以获取
//连接点方法的实参
Object[] args=proceeding.getArgs();
//连接点方法的方法名
String methodName=proceeding.getSignature().getName();
//连接点方法所在的对象
Object targetObj=proceeding.getTarget();
String targetClassName=targetObj.getClass().getName();
Object result=null;
try {
System.out.println("前置通知====");
//执行连接点的方法 获取返回值
result=proceeding.proceed(args);
System.out.println("返回通知====");
}catch (Throwable e) {
System.out.println("异常通知===");
}finally {
System.out.println("最终通知===");
}
return result;
}