切面类和目标类都需要交给IOC容器
@Aspect:将当前主键标识为切面
<aop:aspectj-autoproxy/>:开启基于注解的AOP
@Before("execution(* 包名.类名.*(..))"):将方法标识为前置方法,在目标代码执行之前执行,例@Before("execution(* com.Test.calculatorImpl.*(..))")
(第一个*表任意修饰符和返回值类型,第二个*表类中所有的方法,..表示任意的方法中的任意的参数列表,类名也可写*,表当前包下的所有类,联想一下正则)
在@Before下的通知方法下设置参数JoinPoint joinPoint可获取连接点的信息:
//获取连接点的方法的签名信息(声明信息)
Signature signature = joinPoint.getSignature();
//获取连接点所对应方法的参数
Object[] args = joinPoint.getArgs();
//切入点表达式重用
//@Pointcut设置之后@Before("execution(* 包名.类名.*(..))")可直接使用@Before("pointcut()")
@Pointcut("execution(* com.Test.calculatorImpl.*(..))")
public void pointcut(){}
@After("pointcut()")将方法标识为后置方法,在目标代码的Finally语句中执行
@AfterReturning:返回通知,在目标对象方法返回值之后执行
returning = "result":设置返回值
@AfterReturning(value = "pointcut()", returning = "result")
public void afterReturningAdviceAethod(JoinPoint joinPoint, Object result) {
//获取连接点所对应方法的签名信息
Signature signature = joinPoint.getSignature();
System.out.println(result);
}
@AfterThrowing:异常通知
@AfterThrowing(value = "pointcut()", throwing = "ex")
public void afterReturningAdviceAethod(JoinPoint joinPoint, Exception ex) {
//获取连接点所对应方法的签名信息
Signature signature = joinPoint.getSignature();
System.out.println(signature.getName()+ex);
}
@Around:环绕通知(环绕通知方法的返回值一定要和目标对象的方法的返回值一致)
@Around("pointcut()")
public Object aroundAdviceMethod(ProceedingJoinPoint proceedingJoinPoint){
Object proceed = null;
try {
System.out.println("前置");
//表示目标对象方法的执行
proceed = proceedingJoinPoint.proceed();
System.out.println("返回");
} catch (Throwable e) {
e.printStackTrace();
System.out.println("异常");
}finally {
System.out.println("后置");
}
return proceed;
}
@Order:设置它的value设置切面的优先级,设置的数越小,优先级越高,如@Order(1),写于@Aspect下
网友评论