1、无异常存在的执行顺序:环绕前置--> 普通前置--> 目标方法执行--> 普通返回 --> 普通后置--> 环绕返回 -->环绕后置

以下为代码运行结果

环绕前置通知

[普通前置日志]:方法名称   add   目标对象的类型    class zhl.service.HelloServiceImpl   参数   []

运行的代码

[普通返回日志]:方法调用完成  方法名:add返回值信息:111

普通后置通知

环绕返回通知

环绕后置通知

 2、有异常存在的执行顺序:环绕前置--> 普通前置 --> 目标方法执行 -->普通异常 --> 普通后置

        (1)目标方法有无输出与输出语句在异常语句上还是下决定,若一开始就出现异常则不会输出“运行的代码”

        (2)出现异常由普通异常通知捕捉对其进行处理,异常通知与返回通知是互斥的,有异常无返回,有返回无异常

        (3)因为异常已经被普通异常捕捉,环绕异常通知便不在执行

环绕前置通知

[普通前置日志]:方法名称   add   目标对象的类型    class zhl.service.HelloServiceImpl   参数   []

运行的代码

[普通异常日志] 方法调用异常  方法名:add异常信息:java.lang.ArithmeticException: / by zero

普通后置通知

LogAspect.java如下

package zhl.service;

import org.aspectj.lang.JoinPoint;

import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.*;

import org.springframework.stereotype.Component;

import java.util.Arrays;

@Component

@Aspect

public class LogAspect {

// @Before("bean(helloService)")

// @Before("within(zhl.*)") zhl包下的子类

// @Before("within(zhl..*)") zhl包下的所有子孙类

// @Before("execution(public void zhl..*.*(..))") public 可以省略

@Pointcut("execution(* zhl..*.*(..))")

public void pointcut() {

}

@Before("pointcut()")

public void before(JoinPoint jointPoint){

Object[] args = jointPoint.getArgs();

String methodName = jointPoint.getSignature().getName();

Class targetClass = jointPoint.getTarget().getClass();

System.out.println("[普通前置日志]:方法名称 "+methodName+" 目标对象的类型 "+

targetClass+" 参数 "+ Arrays.toString(args));

}

@AfterReturning(value = "pointcut()",returning = "result")

public void afterReturn(JoinPoint joinPoint,Object result){

String methodName = joinPoint.getSignature().getName();

System.out.println("[普通返回日志]:方法调用完成 方法名:"+methodName+"返回值信息:"+result);

}

@AfterThrowing(value = "pointcut()",throwing = "throwable")

public void throwable(JoinPoint jointPoint,Throwable throwable){

String methodName = jointPoint.getSignature().getName();

System.out.println("[普通异常日志] 方法调用异常 方法名:"+ methodName+"异常信息:"+throwable);

}

@After("pointcut()")

public void after() {

System.out.println("普通后置通知");

}

@Around("pointcut()")

public Object around(ProceedingJoinPoint proceedingJoinPoint){

Object result = null;

try {

System.out.println("环绕前置通知");//类似于前置通知

result = proceedingJoinPoint.proceed();

System.out.println("环绕返回通知");//类似于返回通知

}catch (Throwable throwable) {

throwable.printStackTrace();

System.out.println("环绕异常通知"+throwable.getMessage());//类似于异常通知

}finally {

System.out.println("环绕后置通知");//类似于后置通知

}

return result;

}

}

 HelloService接口

package zhl.service;

public interface HelloService {

int add();

}

HelloServiceImpl接口

package zhl.service;

import org.springframework.stereotype.Service;

@Service("helloService")

public class HelloServiceImpl implements HelloService{

@Override

public int add() {

System.out.println("运行的代码");

// int i = 1/0;

return 111;

}

以上为个人根据代码试出来的规律,跟其他人有一些地方不尽相同,望有大佬予以解答或支持或否定,感谢!!!!

好文链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: