加粗样式
/**
* @Author:
* @Date:2021/3/29 17:10
* @Decription:
*/
@Component // 标识一个spring管理的组件
@Aspect
@Order(2) // 此注解可以指定优先级,值越小,优先级越高,最大值 int最大值
public class LoggingAspect {
/**
* @Auther:
* @Date: 2021/3/31 14:49
* @Description: 声明可重用的切入点表达式
*
* 所有通知上引用reusablePoincout方法的,都要是这个com.zhou.aop.aspect.*.*(.. ))
*/
@Pointcut("execution(* com.zhou.aop.aspect.*.*(.. )))")
public void reusablePointCut(){
}
/**
* @Auther:
* @Date: 2021/3/29 17:17
* @Description: 前置通知,必须指定要作用的目标方法,execution指定切入点表达式 执行时机:在目标方法执行前执行,
*
* 优化切入点表达式:
* 第一个 * : 任意修饰符 任意返回值
* 第二个 * : 任意的类
* 第三个 * : 任意的方法
* .. : 任意的参数列表
*/
// @Before("execution(public int com.zhou.aop.aspect.impl.ArimeticCalulatorimpl.add(int,int )))")
// @Before("execution(* com.zhou.aop.aspect.*.*(.. )))")
@Before("reusablePointCut()")
public void beforeMethod(JoinPoint joinPoint){
// 获取目标方法的参数
Object [] objects = joinPoint.getArgs();
// 获取目标方法名
String methodName = joinPoint.getSignature().getName();
System.out.println("LoggingAspect 执行日志:------ 方法名:"+methodName+",begin with params["+objects[0]+","+objects[1]+"]");
}
/**
* @Auther:
* @Date: 2021/3/31 13:47
* @Description: 后置通知 : 获取不到方法的返回值 执行时机:在目标方法执行后执行,如果目标抛出异常,也是必须执行
*/
@After("execution(* com.zhou.aop.aspect.*.*(.. )))")
public void afterMethod(JoinPoint joinPoint){
// 获取目标方法名
String methodName = joinPoint.getSignature().getName();
System.out.println("LoggingAspect 执行日志:------ 方法名:"+methodName);
}
/**
* @Auther:
* @Date: 2021/3/31 13:55
* @Description: 返回通知:主要用于获取目标方法的返回值 必须通过returing属性指定一个参数名,必须跟形参名保持一致,如果目标抛出异常,是返回不到获取结果的
*/
@AfterReturning(value = "execution(* com.zhou.aop.aspect.*.*(.. )))",returning = "result")
public void AfterReturing(JoinPoint joinPoint ,Object result){
// 获取目标方法名
String methodName = joinPoint.getSignature().getName();
System.out.println("LoggingAspect 执行日志:------ 方法名:"+methodName+" return result:"+result);
}
/**
* @Auther:
* @Date: 2021/3/31 14:01
* @Description: 返回异常通知:在目标方法产生异常才会执行 ,通过throwing属性指定一个异常别名,此别名必须跟当前方法的某个形参保持一致
*/
@AfterThrowing(value = "execution(* com.zhou.aop.aspect.*.*(.. )))",throwing = "exception")
public void AfterThrowingMethod(JoinPoint joinPoint,Exception exception){
// 获取目标方法名
String methodName = joinPoint.getSignature().getName();
System.out.println("LoggingAspect 执行日志:------ 方法名:"+methodName+" throwing exception:"+exception);
}
/**
* @Auther:
* @Date: 2021/3/31 14:10
* @Description: 环绕通知:spring框架为开发者提供的一种在代码中手动控制增加一个方法
* 环绕通知:就可以看做是前面四种通知的结合体
*
* 环绕通知会影响其他通知,所以二者不要一起使用
*/
// @Around(value = "execution(* com.zhou.aop.aspect.*.*(.. )))")
public void aroundMethod(ProceedingJoinPoint joinPoint){
// 获取目标方法的参数
Object [] objects = joinPoint.getArgs();
// joinPoint.
// 获取目标方法名
Object methodName = joinPoint.getSignature().getName();
// 环绕目标方法执行
try {
//前置通知的代码
System.out.println("LoggingAspect 执行日志:------ 方法名:"+methodName+",begin with params["+objects[0]+","+objects[1]+"]");
System.out.println("LoggingAspect 执行日志:------ 方法名:"+methodName+" return result:");
}catch (Exception exception){
System.out.println("LoggingAspect 执行日志:------ 方法名:"+methodName+" throwing exception:"+exception);
}finally {
System.out.println("LoggingAspect 执行日志:------ 方法名:"+methodName);
}
}
}
spring.xml中
<!-- 开启组件扫描 -->
<context:component-scan base-package="com.zhou.aop.aspect"/>
<!-- 基于注解方式实现切面 -->
<aop:aspectj-autoproxy/>