AOP通过描述了抽取的共性功能,根据共性功能抽取的位置不同,最终运行代码时要将其加入到合理的位置,分为以下五种类型:
1.前置通知
当前通知方法在原始切入点方法前运行
// 前置通知
@Before("pt()")
public void beforeAdvice(){
System.out.println("前置通知:在连接点之前执行的共性功能");
}
2.后置通知
当前通知方法在原始切入点方法后运行
// 后置通知
@After("pt()")
public void afterAdvice(){
System.out.println("后置通知:在连接点之后执行的共性功能");
}
3.环绕通知
当前通知方法在原始切入点方法前后运行
(1)环绕通知注意事项
- 环绕通知必须依赖形参ProceedingJoinPoint才能实现对原始方法的调用,进而实现原始方法调用前后同时添加通知
- 通知中如果未使用ProceedingJoinPoint对原始方法实现调用将跳过原始方法的执行
- 对原始方法的调用可以不接收返回值,通知方法设为void即可,如果接收返回值,必须设定为Object类型
- 原始方法的返回值如果是void类型,通知的方法可以设置成void,也可以设置成Object
- 由于无法预知原始方法运行后是否会抛出异常,因此环绕通知方法必须抛出Throwable对象
(2)连接点匹配的方法无返回值的情况
// 环绕通知
@Around("pt()")
public void aroundAdvice(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("在连接点之前执行的共性功能");
pjp.proceed();// 表示对原始操作的调用
System.out.println("在连接点之后执行的共性功能");
}
(3)连接点匹配的方法有返回值的情况
// 环绕通知
@Around("pt()")
public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("在连接点之前执行的共性功能");
Object proceed = pjp.proceed();// 表示对原始操作的调用
System.out.println("在连接点之后执行的共性功能");
return proceed;
}
4.返回后通知
当前通知方法在原始切入点方法正常执行完毕后运行
// 返回后通知
@AfterReturning("pt()")
public void afterReturning(){
System.out.println("返回后通知:原始方法成功执行完之后执行的共性功能");
}
5.抛出异常后通知
当前通知方法在原始切入点方法运行抛出异常后运行
// 抛出异常后通知
@AfterThrowing("pt()")
public void afterThrowing(){
System.out.println("抛出异常后通知:原始方法抛出异常之后执行的共性功能");
}