Spring AOP中@Around增强处理

初次学习Spring 的AOP,就写了一个日志切面,对控制层的接受和返回请求进行切面。

@Aspect
@Component
public class LogAspect {
    //在controller设计一个切面,来记录请求数据和返回数据

    private final Logger logger= LoggerFactory.getLogger(this.toString());

    @Pointcut("execution(* com.zph.springbootapi.api.*.*(..))")
    public void log(){

    }

    @Before("log()")
    public void doBefore(){
        logger.info("--------doBefore 1----------");
    }

    @After("log()")
    public void doAfter(){
        logger.info("--------doAfter 2----------");
    }

    @AfterReturning(returning = "result",pointcut = "log()")
    public void doAfterReturning(Object result){
        logger.info("--------doAfterReturning ----------:内容{}",result);
    }
    @AfterThrowing(pointcut = "log()", throwing="ex")
    public void doAfterThrowing(Exception ex){
        logger.info("--------doAfterThrowing ----------  :{}",ex.getMessage());
    }
    @Around("log()")
    public void doAround(){
        logger.info("--------doAround ----------  ");
    }
}

因为这五个处理方式都用上了,所以结果如下图所示:
在这里插入图片描述
然后就好奇为什么,@Before没有被调用,经过资料的查阅发现,AOP首先进入@Around
在这里插入图片描述
在这里插入图片描述
图片来源:https://blog.csdn.net/qq_41981107/article/details/85260765

@Around作用

1.可以在目标方法之前进行增强动作,也可以执行完目标方法后执行
2.可以决定目标方法何时,以何种方式执行,甚至可以不执行
3.可以改变目标方法的参数值,也可以改变执行目标方法之后的返回值;当需要改变目标方法的返回值时只能使用@Around

注意: 使用@Around的方法的第一个形参必须是ProceedJoinPoint类型,只有待哦用该参数的proceed()方法才会调用目标函数。

ProceedJoinPoint是JoinPoint的子类,多了proceed()方法,并可以抛出异常。

一般的写法如下:

@Around("log()")
    public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        logger.info("--------doAround ----------  ");
        //执行目标方法
        Object obj=proceedingJoinPoint.proceed();
        //只有返回了obj,@AfterReturning才获取返回的结果,否则哪里的result为null
       return obj;
} 

显示结果如下:
在这里插入图片描述

参考文献

https://my.oschina.net/itblog/blog/211693
https://blog.csdn.net/qq_41981107/article/details/85260765

发布了25 篇原创文章 · 获赞 2 · 访问量 958
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览