使用的demo参考这个博客https://blog.csdn.net/wangyijie521/article/details/84951558
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import java.util.Arrays;
/**
* @author linsanity
* @date 2020-09-08 17:37
* @desc
*/
//该注解表示声明该类为一个切面类
@Aspect
@Component
public class LogAspects {
//定义一个切点,表达式可以灵活运用,我这个表达式是表示MathCalculator类中所有的方法都进行切入
@Pointcut("execution(public int com.jdd.aggregation.controller.MathCalculator.*(..))")
public void pointCut () {}
//方法执行开始之前
@Before("pointCut()")
public void logStart (JoinPoint joinPoint) {
System.out.println("除法运行...参数:{"+ Arrays.asList(joinPoint.getArgs())+"}");
}
//方法执行开始之后
@After("pointCut()")
public void logEnd (JoinPoint joinPoint) {
System.out.println("除法结束..." + joinPoint.getSignature().getName());
}
//当方法进行返回的时候,returning属性是指定方法参数中的result来接收返回参数,这样就可以修改返回参数
@AfterReturning(value = "pointCut()", returning = "result")
public void logReturn (JoinPoint joinPoint, Object result) {
System.out.println("除法正常返回... 返回结果:{"+result+"}");
}
//当方法执行异常的时候,throwding是指定方法参数中的e来接收异常参数,可以查看发生的什么异常
@AfterThrowing(value = "pointCut()", throwing = "e")
public void logException (JoinPoint joinPoint, Exception e) {
System.out.println("异常... 异常信息:{"+e+"}");
}
//环绕通知
@Around("pointCut()")
public Object logAround (ProceedingJoinPoint joinPoint) throws Throwable {
//原方法执行之前会打印这个日志
System.out.println("环绕通知... 开始");
//执行原方法
Object obj = joinPoint.proceed();
//原方法执行结束,打印这行日志
System.out.println("环绕通知... 结束");
//返回方法返回参数
return obj;
}
}
import org.springframework.stereotype.Service;
/**
* @author linsanity
* @date 2020-09-08 17:38
* @desc
*/
@Service
public class MathCalculator {
public int div (int i, int j) {
System.out.println("MathCalculator.div...");
return i / j;
}
}
spring boot的版本1.5.9.RELEASE时,执行div方法打印如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
环绕通知... 开始
除法运行...参数:{[1, 1]}
MathCalculator.div...
环绕通知... 结束
除法结束...div
除法正常返回... 返回结果:{1}
spring boot的版本2.3.3.RELEASE时,打印如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
环绕通知... 开始
除法运行...参数:{[1, 1]}
MathCalculator.div...
除法正常返回... 返回结果:{1}
除法结束...div
环绕通知... 结束
由上可见,不同的spring boot版本,对于advice执行的顺序是不同的。为何会出现这种情况,需要进一步查看代码。