在AOP中,通知(Advice)是对切点进行操作的方法,用于实现切面定义的具体逻辑。Spring框架支持五种类型的通知:
1. 前置通知(Before advice)
在连接点执行前,执行通知
@Before("****")
2. 后置通知(After advice)
在连接点执行后,执行通知
@After("****")
3. 返回通知(After returning advice)(了解)
在连接点正常执行完毕返回后,执行通知,如果抛异常的话就不会执行
4. 异常通知(After throwing advice)
在连接点抛出异常后,执行通知
5. 环绕通知(Around advice)(最常用的)
在连接点执行前后,执行通知。环绕通知可以完全控制连接点的执行,包括决定是否执行连接点以及在哪个时点执行连接点;
包围一个连接点的通知,类似 Web 中 Servlet规范中的 Filter 的 doFilter 方法。可以在方法的调用前后完成自定义的行为,也可以选择不执行
第一种:没有返回值的
//@Around:环绕通知,在原始方法运行的前后执行
@Around("pt()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("around before advice ...");
//表示对原始操作的调用
Object ret = pjp.proceed();
System.out.println("around after advice ...");
return ret;
}
第二种:有返回值的
环绕通知,对于有返回值的记得接收它的返回值并返回
@Around("pt2()")
public Object aroundSelect(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("around before advice ...");
//表示对原始操作的调用
Integer ret = (Integer) pjp.proceed();
System.out.println("around after advice ...");
return ret;
}
需要注意的是,通知类型只是概念上的区分,实现上通知并没有过多的差异。所有的通知都可以被绑定到连接点上,并在连接点执行前、后或中间被调用。