// @Aspect表示这个类是一个切面类@Aspect// @Component注解保证这个切面类能够放入IOC容器@ComponentpublicclassLogAspect{// @Before注解:声明当前方法是前置通知方法// value属性:指定切入点表达式,由切入点表达式控制当前通知方法要作用在哪一个目标方法上@Before(value="execution(public int com.atguigu.proxy.CalculatorPureImpl.add(int,int))")publicvoidprintLogBeforeCore(){System.out.println("[AOP前置通知] 方法开始了");}@AfterReturning(value="execution(public int com.atguigu.proxy.CalculatorPureImpl.add(int,int))")publicvoidprintLogAfterSuccess(){System.out.println("[AOP返回通知] 方法成功返回了");}@AfterThrowing(value="execution(public int com.atguigu.proxy.CalculatorPureImpl.add(int,int))")publicvoidprintLogAfterException(){System.out.println("[AOP异常通知] 方法抛异常了");}@After(value="execution(public int com.atguigu.proxy.CalculatorPureImpl.add(int,int))")publicvoidprintLogFinallyEnd(){System.out.println("[AOP后置通知] 方法最终结束了");}}
// @AfterReturning注解标记返回通知方法// 在返回通知中获取目标方法返回值分两步:// 第一步:在@AfterReturning注解中通过returning属性设置一个名称// 第二步:使用returning属性设置的名称在通知方法中声明一个对应的形参@AfterReturning(value="execution(public int com.atguigu.aop.api.Calculator.add(int,int))",returning="targetMethodReturnValue")publicvoidprintLogAfterCoreSuccess(JoinPointjoinPoint,ObjecttargetMethodReturnValue){StringmethodName=joinPoint.getSignature().getName();System.out.println("[AOP返回通知] "+methodName+"方法成功结束了,返回值是:"+targetMethodReturnValue);}
异常对象捕捉
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// @AfterThrowing注解标记异常通知方法// 在异常通知中获取目标方法抛出的异常分两步:// 第一步:在@AfterThrowing注解中声明一个throwing属性设定形参名称// 第二步:使用throwing属性指定的名称在通知方法声明形参,Spring会将目标方法抛出的异常对象从这里传给我们@AfterThrowing(value="execution(public int com.atguigu.aop.api.Calculator.add(int,int))",throwing="targetMethodException")publicvoidprintLogAfterCoreException(JoinPointjoinPoint,ThrowabletargetMethodException){StringmethodName=joinPoint.getSignature().getName();System.out.println("[AOP异常通知] "+methodName+"方法抛异常了,异常类型是:"+targetMethodException.getClass().getName());}
切入点表达式
一图胜千言。
切入点表达式提取
1
2
3
4
5
6
// 切入点表达式重用@Pointcut("execution(public int com.atguigu.aop.api.Calculator.add(int,int)))")publicvoiddeclarPointCut(){}@Before(value="declarPointCut()")publicvoidprintLogBeforeCoreOperation(JoinPointjoinPoint){