1、 前置通知和后置通知(即使异常也会执行)
a) 接口
package com.spring.aop2;
public interface IDivision {public int division(int a,int b);
}
b) 接口实现类
package com.spring.aop2;
import org.springframework.stereotype.Component;
@Component
public class Division implements IDivision {
public int division(int a,int b){
int c=a/b;
return c;
}
}
c) 切面类com.spring.aop2.DivisionAspect的前置通知和后置通知
//前置通知
@Before("execution(public int com.spring.aop2.Division.*(..))")
public void beforeAop(JoinPoint jp){
String methodName=jp.getSignature().getName();//获得被调用的方法名
Object[] args=jp.getArgs();//获得被调用方法的参数
System.out.println("@Before执行:"+methodName+"方法,参数为:"+Arrays.asList(args));
}
//后置通知
@After("execution(public int com.spring.aop2.Division.*(..))")
public void afterAop(JoinPoint jp){
String methodName=jp.getSignature().getName();//获得被调用的方法名
Object[] args=jp.getArgs();//获得被调用方法的参数
System.out.println("@After执行:"+methodName+"方法,参数为:"+Arrays.asList(args));
}
d) 配置文件(注意定义aop和context)
e) main方法
f) 执行结果
2、 返回通知
//返回通知
//@AfterReturning注解中添加表达式returning属性用来传入返回值
@AfterReturning(pointcut="execution(public int com.spring.aop2.Division.*(..))",returning="result")
//第二个参数Object的参数名必须和表达式returning属性名一致
public void afterReturningAop(JoinPoint jp,Object result){
String methodName=jp.getSignature().getName();//获得被调用的方法名
Object[] args=jp.getArgs();//获得被调用方法的参数
System.out.println("@AfterReturning执行:"+methodName+"方法,参数为:"+Arrays.asList(args)+",返回结果为:"+result);
}
3、 异常通知
//异常通知
//@AfterThrowing注解中添加表达式throwing属性用来传入异常信息
@AfterThrowing(pointcut="execution(public int com.spring.aop2.Division.*(..))",throwing="ex")
//第二个参数异常类(也可以根据需要指定异常类)的参数名必须和表达式throwing属性名一致
public void afterThrowingAop(JoinPoint jp,Exception ex){
String methodName=jp.getSignature().getName();//获得被调用的方法名
Object[] args=jp.getArgs();//获得被调用方法的参数
System.out.println("@AfterReturning执行:"+methodName+"方法,参数为:"+Arrays.asList(args)+",异常信息为:"+ex);
}
4、 环绕通知(不常用)环绕通知包括了前置通知、后置通知、返回通知、异常通知
//环绕通知(此例子不完美有异常)
@Around("execution(public int com.spring.aop2.Division.*(..))")
public void aroundAop(ProceedingJoinPoint pjp){
String methodName=pjp.getSignature().getName();//获得被调用的方法名
Object[] args=pjp.getArgs();//获得被调用方法的参数
try {
System.out.println("@Around执行前置通知:"+methodName+"方法,参数为:"+Arrays.asList(args));
Object result=pjp.proceed();//执行方法被调用并得到返回值
System.out.println("@Around执行返回通知,返回值为:"+result);
} catch (Throwable ex) {
ex.printStackTrace();
System.out.println("@Around执行异常通知,异常信息为:"+ex);
}
System.out.println("@Around执行后置通知");
}