SpringBoot应用AOP及各注解的执行顺序 统一AOP切面
1、先确定要切入的点(就是需要访问那些类或名称等的切入点)
2、比如切入点是所有的ServiceImpl类,当访问所有的ServiceImpl列为切入点;当然也可以是其它的,比如mapper做主从切换思路时切入点就设为mapper也是可以的。
ServiceImpl类
package com.demo.system.ServiceImpl;@Override
public class demoServiceImpl implements demoService
{@Overridepublic void selectDemo(int i, int j){System.out.println("正常业务方法....");return i / j;}
}
切面类
/*** spring AOP 切入点*/@Aspect@Componentpublic class csAspect {//定义一个切点,表达式可以灵活运用,我这个表达式是表示MathCalculator类中所有的方法都进行切入 @Pointcut("execution(* com.demo.system.ServiceImpl..*.*(..))")public void pointCut () {}//方法执行开始之前@Before("pointCut()")public void logStart (JoinPoint joinPoint) {System.out.println("除法运行...参数:{"+ Arrays.asList(joinPoint.getArgs())+"}");}//环绕通知@Around("pointCut()")public Object logAround (ProceedingJoinPoint joinPoint) throws Throwable {//原方法执行之前会打印这个日志System.out.println("环绕通知... 开始");//执行原方法Object obj = joinPoint.proceed();//原方法执行结束,打印这行日志System.out.println("环绕通知... 结束");//返回方法返回参数return obj;}//方法执行开始之后@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+"}");}}
运行结果
环绕通知... 开始除法运行...参数:{[1, 1]}正常业务方法....环绕通知... 结束除法结束...div除法正常返回... 返回结果:{1}
运行的顺序是
参考网站:https://zhuanlan.zhihu.com/p/560455607
需要注意的是:@Pointcut、@Before、@After等注解内的“切入点”配置有很多说明,有些是针对方法注解使用(自定义注解),有些是针对正常普通方法使用,选择不同的配置获取的类信息对象也是不一样,如果是获取自定义注解的信息使用ProceedingJoinPoint,如果是普通方法类信息使用JoinPoint
参考: https://blog.csdn.net/m0_37840000/article/details/80905791
ProceedingJoinPoint和JoinPoint区别参考:
https://blog.csdn.net/m_shang/article/details/114538561