SpringBoot应用AOP及各注解的执行顺序 统一AOP切面

SpringBoot应用AOP及各注解的执行顺序 统一AOP切面

1、先确定要切入的点(就是需要访问那些类或名称等的切入点)

2、比如切入点是所有的ServiceImpl类,当访问所有的ServiceImpl列为切入点;当然也可以是其它的,比如mapper做主从切换思路时切入点就设为mapper也是可以的。

ServiceImpl类

package com.demo.system.ServiceImpl;

@Override
public class demoServiceImpl  implements demoService
{
  	@Override
 	public void selectDemo(int i, int j){
 		System.out.println("正常业务方法....");
        return i / j;
 	}
}

切面类

	/**
	 * spring AOP  切入点
	 */
	@Aspect
	@Component
	public 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}

运行的顺序是

  • 1、@Around(方法执行开始之前,相当于进入切入点的类,但还没开始访问类的方法进行的前半段代码,以point.proceed()为止,触发point.proceed()后,进入@Before)
  • 2、@Before(方法执行开始之前)
  • 3、原方法
  • 4、@Around(衔接 1 方法进行后半段代码,整个方法全部执行完,进入@After)
  • 5、@After (方法执行开始之后)
  • 6、@AfterReturning(若目标方法无异常,执行@AfterReturning注解方法的业务逻辑)
  • 7、@AfterThrowing(若目标方法有异常,执行@AfterThrowing注解方法的业务逻辑)

参考网站: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

你可能感兴趣的:(spring家族,java,开发语言)