首先导入aop的包和相关依赖包
在配置文件中创建增强方法的bean,随后配置aop的相关内容
<bean id="userService" class="com.aop.service.UserServiceImpl"></bean> <bean id="logger" class="com.aop.logger.LoggerTest"></bean> <aop:config> <!--配置切入点表达式--> <aop:pointcut expression="execution(* *..*.*(..))" id="log"></aop:pointcut> <!--配置切面--> <aop:aspect id="logAop" ref="logger"> <!--前置通知--> <aop:before method="beforePrintLog" pointcut-ref="log"></aop:before> <!--后置通知--> <aop:after-returning method="afterReturingPrintLog" pointcut-ref="log"></aop:after-returning> <!--异常通知--> <aop:after-throwing method="afterThrowingPrintLog" pointcut-ref="log"></aop:after-throwing> <!--最终通知--> <aop:after method="afterPrintLog" pointcut-ref="log"></aop:after> </aop:aspect> </aop:config>配置切入点表达式时,表达式一定要加execution() 全通配表达式* *..*.*(..)
下面的是相关类的代码
// 前置通知 public void beforePrintLog() { System.out.println("前置通知beforePrintLog执行了"); } // 后置通知 public void afterReturingPrintLog() { System.out.println("后置通知afterReturingPrintLog执行了"); } // 异常通知 public void afterThrowingPrintLog() { System.out.println("异常通知afterThrowingPrintLog执行了"); } // 最终通知 public void afterPrintLog() { System.out.println("最终通知afterPrintLog执行了"); }此处根据你是否要测试异常来选择注释掉 int = 1/0;
@Override public void findAllUser() { int i = 1/0; System.out.println("执行了查询操作"); }环绕通知比较特殊,不能像之前其他通知一样配置,以下配置会导致切入点方法不执行
public Object aroundPrintLog() { System.out.println("环绕通知aroundPrintLog执行了"); return null; <aop:around method="aroundPrintLog" pointcut-ref="log"></aop:around>由动态代理可知,环绕通知就是invoke方法,但环绕通知里没有明确的切入点方法调用 解决:使用Spring提供的ProceedingJoinPoint,该接口可以作为环绕通知方法的参数使用 该接口有一个方法proceed(),此方法等同于method.invoke(),就是明确调用切入点方法
public Object aroundPrintLog(ProceedingJoinPoint pjp) { Object result = null; try { System.out.println("前置通知执行了=========="); result = pjp.proceed(); System.out.println("后置通知执行了=========="); } catch (Throwable e) { System.out.println("异常通知执行了=========="); e.printStackTrace(); }finally { System.out.println("最终通知执行了=========="); } return result; }
此文章为我个人的学习笔记总结,自用