Spring-AOP通知类型

推荐先阅读Spring全家桶

AOP通知描述了抽取的共性功能,根据共性功能抽取的位置不同,最终运行代码时要将其加入到合理的位置

AOP通知共分为5种类型

  • 前置通知@Before
  • 后置通知@After
  • 环绕通知(重点)@Around
  • 返回后通知(了解)@AfterReturning
  • 抛出异常后通知(了解)@AfteThrowing

@Before:当前通知方法在原始切入点方法运行

@Before("pt()")
//此处也可以写成 @Before("MyAdvice.pt()"),不建议
public void before() {
System.out.println("before advice ...");
}

@After:当前通知方法在原始切入点方法运行

@After("pt()")
public void after() {
System.out.println("after advice ...");
}

@Around:当前通知方法在原始切入点方法前后运行

@Around("pt()")
public Object aroundSelect(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("around before advice ...");
//表示对原始操作的调用
Object ret = pjp.proceed();
System.out.println("around after advice ...");
return ret;
}

@Around注意事项:

  1. 环绕通知必须依赖形参ProceedingJoinPoint才能实现对原始方法的调用,进而实现原始方法调用前后同时添加通知
  2. 通知中如果未使用ProceedingJoinPoint对原始方法进行调用将跳过原始方法的执行
  3. 对原始方法的调用可以不接收返回值,通知方法设置成void即可,如果接收返回值,最好设定为Object类型
  4. 原始方法的返回值如果是void类型,通知方法的返回值类型可以设置成void,也可以设置成Object
  5. 由于无法预知原始方法运行后是否会抛出异常,因此环绕通知方法必须要处理Throwable异常

@AfterReturning:当前通知方法在原始切入点方法正常执行完毕运行

@AfterReturning("pt()")
public void afterReturning() {
System.out.println("afterReturning advice ...");
}

@AfteThrowing:当前通知方法在原始切入点方法运行抛出异常后执行

@AfteThrowing("pt()")
public void afterThrowing() {
System.out.println("afterThrowing advice ...");
}