java代码样式讲解aop五种通知类型

观看本文前 您需要先搭建Spring操作aop的基本条件
如果之前没有接触 可以先查看我的文章
java Spring aop入门准备工作
其次 您需要了解 强化方法的基本语法
如果之前没有接触过 可先查看我的文章
以before为例 完成一个aop代理强化方法案例

上一篇文章已经讲完了怎么增强一个方法 或者说 就是增加了一个生命周期
处理before 还有其他四种通知类型 我们都来看一下

我们直接构建一个增强方法的类
参考代码如下

package Aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.stereotype.Component;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;

@Component
@Aspect
public class UserProxy {
    //被增强方法执行前调用
    @Before(value = "execution(* Aop.User.add(..))")
    public void before() {
        System.out.println("before...");
    }

    //在方法结束后执行
    @After(value = "execution(* Aop.User.add(..))")
    public void after() {
        System.out.println("After...");
    }

    //在方法返回数据后执行   没有返回值 执行到位 也会执行
    @AfterReturning(value = "execution(* Aop.User.add(..))")
    public void afterReturning() {
        System.out.println("AfterReturning...");
    }

    //被增强方法发生异常时通知
    @AfterThrowing(value = "execution(* Aop.User.add(..))")
    public void afterThrowing() {
        System.out.println("AfterThrowing...");
    }

    //环绕通知   在方法执行前和执行后都会执行  用参数中的proceed方法 代表方法执行
    @Around(value = "execution(* Aop.User.add(..))")
    public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("被增强方法执行前");
        proceedingJoinPoint.proceed();
        System.out.println("被增强方法执行后");
    }
}

我们定义了五个方法 对应五种通知类型 他们指向的强化方法 都Aop包下的User类的 add方法
然后
@Before注解标注的方法 会在指向的方法执行前执行
@After注解标注的方法 会在指向的方法执行结束后执行
@AfterReturning标注的方法 也是在被标注的方法结束执行 但他与After的不同在于 他是等被指定方法给出返回值后执行 但如果你的方法没有返回值 他也会走的
@AfterThrowing注解标注的方法 会在指定方法发生异常时执行
@Around标注的方法 相对特殊一点 这个叫环绕通知 在方法执行前和执行后 都会执行 但执行的片段不一样
他接收一个ProceedingJoinPoint 类型的对象参数 对象中有一个proceed函数 需要在方法中调用
写在调用proceed前的代码 会在指定方法前执行 而在proceed后面的则反过来 会在指定方法执行后执行

我们先简单运行一下 user类的add方法
在这里插入图片描述
运行结果如下 可以看到 环绕方法 是会早于 其他几种开始和结束监听的 当然 还有一个没被执行

因为AfterThrowing在监听异常 而我们的方法好好的 那我们就弄点问题出来 让他监听一下

我们找到 User类 修改被增强的add方法如下

public void add(){
    int i = 10/0;
    System.out.println("add......");
}

这里 我们直接来个 除以0 强行写个异常出来
运行结果如下
在这里插入图片描述
这里 我们也成功监听到了

这是 我们也可以看到After和AfterReturning一个更大的区别
在于 AfterReturning在方法被中断之后 就没得执行了 因为他要返回啊 都异常报错了 还返回个啥
但After不管你方法是什么原因终止的 只要方法已结束 他就执行
所以 我们发现 异常之后 只有After执行了 其他两个结束的监听 都因为异常 中断了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值