AOP注解:
(1)@Pointcut:在使用其他注解时,需要写包的表达式,而@Pointcut就是用来声明一样的包路径,已达到代码简便
/**
* 多个方法的表达式一样,可以自定义一个无参构造方法,
* 定义后添加@PointCut,后续使用可以直接调用
* 此处的方法只是起到一个声明作用,能够提供内部其他通知方法的调用
*/
@Pointcut("execution(public Integer com.msb.service.MyCalculcator.*(Integer,Integer))")
public void myPointCut(){ }
(2)@Acound:环绕通知
/**
* 环绕通知执行的时候是优先于普通通知的
* 如果是正常结束,执行结束是:
* 环绕前置通知 -> @Before -> 环绕后置通知 -> 环绕通知返回 -> @After -> @AfterReturning
* 如果是异常结束:
* 环绕前置通知 -> @Before -> 环绕异常通知 -> 环绕通知返回 -> @AfterThrowing -> @AfterReturning
* 如果出现异常的时候,在环绕通知中解决了,普通通知是接收不到的,如果想要让普通通知接收到需要进行抛出throw throwable
* 执行顺序:
* 环绕前置通知 -> @Before -> 环绕异常通知 -> 环绕通知返回 -> @AfterThrowing -> @AfterThrowing
*/
//环绕通知
@Around(value = "myPointCut()")
public Object around(ProceedingJoinPoint proceedingJoinPoint){
//获取方法名
Signature signature = proceedingJoinPoint.getSignature();
//获取方法信息
Object[] args = proceedingJoinPoint.getArgs();
Object result = null;
try {
//前置通知
System.out.println("环绕通知strat:"+signature.getName()+"方法开始执行,参数为:"+ Arrays.asList(args));
//通过反射的方式调用目标的方法,相当于执行method.invoke(),可以自己修改结果值
result = proceedingJoinPoint.proceed(args);
//返回通知:返回执行结果之后执行
System.out.println("环绕通知stop:"+signature.getName()+"方法执行结束");
}catch (Throwable throwable) {
//异常通知
System.out.println("环绕异常通知:"+signature.getName()+"出现异常");
}finally {
//后置通知:在方法执行结束之后执行
System.out.println("环绕返回通知:"+signature.getName()+"方法返回结果:"+result);
}
return result;
}
(3)关于两个切面类的执行顺序:若有多个切面类,执行的时候按照的顺序:执行顺序是按照类名的首字符,越小越优先,可以用@Order(数字)注解,数字越小越优先
关于AOP学习源码链接:源码下载