观看本文前 您需要先搭建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执行了 其他两个结束的监听 都因为异常 中断了