-
5种通知的简单介绍:
(1)前置通知(Before advice):在某连接点(join point)之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)。
(2)返回后通知(After returning advice):在某连接点(join point)正常完成后执行的通知:例如,一个方法没有抛出任何异常,正常返回。
(3)抛出异常后通知(After throwing advice):在方法抛出异常退出时执行的通知。
(4)后通知(After (finally) advice):当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。
(5)环绕通知(Around Advice):包围一个连接点(join point)的通知,如方法调用。这是最强大的一种通知类型。 环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。 环绕通知是最常用的一种通知类型。大部分基于拦截的AOP框架,例如Nanning和JBoss4,都只提供环绕通知。 -
5种通知的执行顺序:
同一个aspect,不同advice的执行顺序:
①没有异常情况下的执行顺序:
around before advice
before advice
target method 执行
around after advice
after advice
afterReturning②有异常情况下的执行顺序:
around before advice
before advice
target method 执行
around after advice
after advice
afterThrowing:异常发生
java.lang.RuntimeException: 异常发生 -
直接上springboot中的AOP使用例子
@Component
@Aspect
public class AlphaAspect {
//定义切点,第一个*表示返回值 第一个.*表示所有类 第二个.*表示所有方法 (..)表示所有参数
@Pointcut("execution(* com.newcode.community.community.service.*.*(..))")
public void pointcut(){
}
//定义前置通知
@Before("pointcut()")
public void before(){
System.out.println("before...");
}
//定义后置通知
@After("pointcut()")
public void after(){
System.out.println("after...");
}
//定义返回后通知
@AfterReturning("pointcut()")
public void afterReturning(){
System.out.println("afterReturning...");
}
//定义异常后通知
@AfterThrowing("pointcut()")
public void afterThrowing(){
System.out.println("afterThrowing...");
}
//定义环绕通知
@Around("pointcut()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("aroundBefore...");
Object obj = joinPoint.proceed();
System.out.println("aroundAfter...");
return obj;
}
}