这里用后置通知与返回通知及异常通知、环绕通知为例,演示切面表达式及一些与切面有关的额外内容。
- 返回通知
后置通知的执行窗口为方法执行完后执行,不管方法是否抛出异常都会执行!。在后置通知里不能获取方法的返回值,如果需要获取方法的返回值,需要在返回通知里处理。
@After("execution(* * ml.cathome.aspectj.demo.*.*(..)")
public void AfterInfoDemo (JoinPoint joinPoint) {
/**
* joinPoint 对象可以获取一些切入点的信息,如方法名,方法参数
**/
// 获取方法名
String methodName = joinPoint.getSignature().getName();
Object[] args = joinPoint.getArgs();
System.out.println(Arrays.asList(args) + " - " + methodName);
}
第1个*代表任意修复符
第2个*代表任意返回值
第3个*代表ml.cathome.aspectj下的所有类
第4个*代表ml.cathome.aspectj下所有类的所有方法
..代表任意多、任意类型的参数。
返回通知
返回通知的执行窗口是在方法正常返回后执行,方法在执行过程中抛出异常则不执行。在返回通知里可以获取方法的返回值,但需要在表达式里声明returning属性,将形参里的名与returning属性的值保持一致。实例
@AfterReturning(value="execution(* ml.cathome.aspectj.demo.*.*(..))", returning="backValue")
public void afterReturningDemo(JoinPoint joinPoint, Object backValue) {
System.out.println("方法返回值:" + backValue);
}
异常通知
异常通知的执行窗口是当方法抛出异常时执行,可以自定捕获哪些类型的异常,也可以捕获所有的异常信息。与返回通知一致,execution表达式里的exception属性值必须与方法声明处异常类型形参名一致。实例
@AfterThrowing(value="execution(* ml.cathome.aspectj.demo.*.*(..)", throwing="ex")
public void afterThrowExceptionDemo(JoinPoint joinPoint, Exception ex) {
Object[] args = joinPoint.getArgs();
System.out.println("传入参数为:" + Arrays.asList(args));
String methodName = joinPoint.getSignature().getName();
System.out.println("执行方法名:" + methodName);
System.out.println("异常类型:" + ex);
}
如需指定异常才捕获,可以将Exception替换成需要的异常类即可。
环绕通知
环绕通知执行时期为整个方法的运行过程,如果环绕通知里可以做到前置通知、后置通知、返回通知、异常通知。实例
@Around("execution(* * ml.cathome.aspectj.*.*(..))")
public Object aroundInfoDemo(ProceedingJoinPoint proceedingJoinPoint){
try {
// 在这里写前置通知功能
// 执行目标方法
Object result = proceedingJoinPoint.proceed();
// 在这里写返回通知
return result;
} catch (throwable e){
// 在这里写异常通知
e.printStackTrace();
} finally {
// 在这里写后置通知
}
return null;
}
注意:环绕通知必须返回Object类型。