@Before()
前置通知:声明该方法为方法执行之前的通知
//声明该方法是一个前置通知
@Before("execution(public int com.spring.spring.impl.AitihmeticCalculator.add(int,int))")
public void beforeMethod(JoinPoint joinPoint){
List<Object> args = Arrays.asList(joinPoint.getArgs());
System.out.println(args);
}
@After()
后置通知:声明该方法为方法执行之后的通知(无论结果发生异常)都执行的通知
后置通知还不能访问目标方法的执行结果
//声明该方法是一个后置通知(无论是否发生异常),执行的通知
//后置通知中还不能访问目标方法的执行结果
@After("execution(* com.spring.spring.impl.AitihmeticCalculator.*(int ,int))")
public void afterMethod(JoinPoint joinPoint){
List<Object> args = Arrays.asList(joinPoint.getArgs());
System.out.println("后置通知"+args);
}
@AfterReturning(value="",returning="")
返回通知:声明该方法是方法正常结束执行之后的代码,返回通知可以拿到返回值
//声明该方法是返回通知,在方法正常结束之后执行的代码
//返回通知是可以访问到方法的返回值的
@AfterReturning(value = "execution(* com.spring.spring.impl.AitihmeticCalculator.*(int ,int))",returning = "result")
public void afterReturning(JoinPoint joinPoint,Object result){
String name = joinPoint.getSignature().getName();
System.out.println(name+"->"+result);
}
异常通知:在方法抛出异常时执行的代码,可以指定异常类型
//在目标方法执行异常时执行的代码
//可以访问到异常对象,可以指定出现特定异常时出现的通知
@AfterThrowing(value = "execution(* com.spring.spring.impl.AitihmeticCalculator.*(int ,int))",throwing = "ex")
public void afterThrowing(JoinPoint joinPoint,Exception ex){
String name = joinPoint.getSignature().getName();
System.out.println("这是异常通知"+name+"->"+ex);
}
环绕通知:环绕通知是最全的,它包括动态代理的全过程,环绕通知必须有返回值,返回值即为目标方法的返回值
//环绕通知需要携带ProceedingJoinPoint 类型的参数
//环绕通知类似于动态代理的全过程 ProceedingJoinPoint 类型的参数可以决定是否执行目标方法
//且环绕通知必须有返回值,返回值即为目标方法的返回值
@Around("execution(* com.spring.spring.impl.AitihmeticCalculator.*(int ,int))")
public Object aroundMethod(ProceedingJoinPoint pjd){
String methodname = pjd.getSignature().getName();
Object result = null;
try {
//这里相当于前置通知
System.out.println("前置通知"+"->"+Arrays.asList(pjd.getArgs()));
//执行目标方法
result = pjd.proceed();
//这里相当于返回通知
System.out.println("返回通知"+"->"+result);
} catch (Throwable throwable) {
//这里相当于异常通知
System.out.println("异常通知"+"->"+throwable);
throw new RuntimeException();
}finally {
//这里相当于后置通知
System.out.println("后置通知"+"->"+methodname+"end");
}
return result;
}