Spring之AOP(二)

上篇文章介绍了如何通过切面打印日志,接下来填几个上篇文章的坑,顺便介绍一下通过切面实现处理异常等操作。
坑一:

由图可知切面的执行顺序,@Around是在@Before之前执行的,@Around我们都知道是围绕在方法上执行的,而@Before和@After是分别在方法执行前和执行后才执行的,所以最大的坑就是@Around和@Before、@After是不能同时放在一起执行的,否则执行@Around后@Before和@After是会失效的。实质上这两种切面的实现方式就是不同的,可以理解为另一种切面。
坑二:
@Before和@After,这两种实现起来就比较简单了,分别在控制的方法前后执行就可以了,可以简单的在执行接口开始和结束打印日志,实现方式可以看上一篇文章。至于为什么用@AfterReturnung而不用@After呢?其实很简单,@AfterReturning可以很简单的获取到接口执行完成的返回值,当然@After也可以获得,只是相较于@AfterReturning复杂一点而已,如不需要返回值,就没什么区别了。
接下来介绍一下@Around的用法和配置。
通过AOP做一些权限拦截。
先自定义一个注解:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface DisposeStr {
}

@Retention(RetentionPolicy.RUNTIME):为注解设定生命周期
@Target(ElementType.METHOD):限制注解的修饰类型
为这个注解设定行为:

@Around(" @annotation( com.example.rpcdemo.aop.DisposeStr) && args(data)")
    public String around(ProceedingJoinPoint point, String data) throws Throwable {
        if("2045".equals(data)){
            return "错误的参数";
        }
       String ret = (String) point.proceed();
        return ret;
    }

这样,被@DisposeStr这个注解修饰的方法就可以通过切面对这个方法进行判定了。接口代码同上次一样(多个注解):

@RestController
@RequestMapping("/aop")
public class DemoAOPs {

    @PostMapping("/demos")
    @DisposeStr
    public String demoHello(@RequestParam("tstr") String aaa) {
        System.out.println("执行接口");
        return "这是测试切面" + aaa;
    }
}

这样,当调用这个接口是,当传入的参数为aop中限制的参数时或不符合规定时,就可以进行抛出异常,直接返回。
在这里插入图片描述
细心的小伙伴们可以发现,我同时用了@Before和@Around,为什么同时执行了呢,解决办法:
一:将@Before和@Around分别写在两个类中,通过@Order(n)指定执行顺序,n越小越先执行,这样让@Before在之前执行就可以了。
二:在@Around中在执行一遍接口,这样也可以解决,因为我将@Before和@Around都写在了一个方法里,所以我加了point.proceed()。
另外@Around的另一个坑:
当@Around执行后,ruturn之后就直接退出接口了,就算接口没问题,也会直接返回跳出这个接口不执行了。所以就有了
point.proceed()这行代码,意思是结束后在执行一遍接口,这样就不会跳出接口直接返回了。也可以在@Around中在调用一遍接口的执行。
另外可能会问,为什么@Around切面就要自定义一个注解呢?
其实是一样的,不用注解也可以实现环绕切面的,这么做是因为@Around在我们这个中是用作权限判断的,不同于日志,日志是所有接口在执行时是都需要打印日志的,判断权限是不需要每个接口都实现的,所以这里自定义了一个注解,这样只需要在需要判断的接口上加上这个注解就可以了。AOP的其他功能也都如此。
以上纯为个人见解,有问题可以一起评论交流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值