版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_38111957/article/details/83717342
一、引言
以你为AOP只有前置通知和后置通知吗? 那你就错啦
在AOP中一共有五种方式:
@Befor:前置通知:在方法执行之前执行
@After:后置通知,在方法之后执行
@AfterReturning:返回通知,在方法返回结果之后执行
@AfterThrowing:异常通知:在方法抛出异常之后
@Around:环绕通知,围绕着方法执行
先定义一个横切点:
/**
* 定一个Pointcut,此方法没有返回值和参数
* 该方法就是一个标识,不进行调用
*
* execution中解释:
* 第一个* :表示任意修饰符的方法
* com.spring.two.UserMangeImpl.* : 具体的类下面全部的方法
* (..):任意参数列表
*/
@Pointcut("execution(* com.spring.two.UserMangeImpl.*(..))")
public void beforLog(){}
二、返回通知
/**
* 方法正确返回时调用
* returning 使用这个属性,指定接收的返回值
* @param result
*/
@AfterReturning(value = "beforLog()",returning ="result")
public void insertLogAfterReturning(Object result){
System.out.println("InsertLogHeadr.insertLogAfter 返回值-->" + result);
}
三、异常通知
/**
* 方法发生异常之后
* throwing 使用这个属性,可以指定某一个异常后执行
*/
@AfterThrowing(value = "beforLog()",throwing = "ex")
public void insertLogAfterThorwing(Exception ex){
System.out.println("InsertLogHeadr.insertLogAfterThorwing");
}
四、环绕通知
返回通知,和异常通知就没有什么好说的了。
这个环绕通知,那我就还得说说说下。 环绕通知就相当于动态代理的全过程,看过小编之前讲动态代理实现的那个章节,可能有点印象。 注释上也说了,环绕通知需要携带一个参数,并且一定要有返回值。
/**
* 环绕通知需要携带ProceedingJoinPoint类型参数
* 环绕通知必须有返回值,返回值即为目标方法的返回值
* @param joinPoint
* @return
*/
@Around("beforLog()")
public Object insertLogAround(ProceedingJoinPoint joinPoint){
Object result = null;
try {
//前置通知
System.out.println("前置通知.......");
//调用目标的方法
result = joinPoint.proceed();
//返回通知
System.out.println("返回通知.......");
} catch (Throwable e){
e.printStackTrace();
//异常通知
System.out.println("异常通知.......");
}
//后置通知
System.out.println("后置通知.......");
return result;
}