Spring的AOP配置--XML文件配置

it2022-05-05  164

首先导入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; }

 

此文章为我个人的学习笔记总结,自用


最新回复(0)