Spring-AOP配置文件方式详解

    xiaoxiao2022-07-07  152

    配置:

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd" > <!--开启以注解形式的切面驱动--> <aop:aspectj-autoproxy/> <!--定义切面bean--> <bean id="permApect" class="spring.aspect.PermAspect"/> <bean id="userService" class="spring.service.impl.UserServiceImpl"/> <aop:config> <!-- 切点配置: expression:切点的表达式 --> <aop:pointcut id="mycut" expression="execution(* spring.service..*.*(..))"/> <!--切面配置 ref:要关联的切面类 --> <aop:aspect ref="permApect"> <!-- 前置通知 method:切面类的方法 pointcut-ref:切点 --> <aop:before method="preAvice" pointcut-ref="mycut"/> <!--后置通知--> <aop:after method="afterAvice" pointcut-ref="mycut"/> <!--返回通知 returning:业务方法返回的值,得跟returnAvice方法里的参数同名 --> <aop:after-returning method="returnAvice" pointcut-ref="mycut" returning="returnval"/> <!--例外通知 throwing:抛出的异常的变量名 --> <aop:after-throwing method="exceptionAdvice" pointcut-ref="mycut" throwing="ex"/> <!--环绕通知--> <aop:around method="aroundAdvice" pointcut-ref="mycut" /> </aop:aspect> </aop:config> </beans>

     

    切面:

    package spring.aspect; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import spring.model.User; public class PermAspect { public void preAvice(JoinPoint jp) { Object[] args = jp.getArgs(); System.out.println("执行前置通知---业务参数" + args[0]); } public void afterAvice(JoinPoint jp) { Object[] args = jp.getArgs(); System.out.println("执行后置通知---业务参数" + args[0]); } public void returnAvice(JoinPoint jp, Object returnval){ if (returnval instanceof User) { User user = (User) returnval; user.setUsername("xxx"); } System.out.println("返回通知----" + returnval); } public void exceptionAdvice(JoinPoint js, Exception ex) { System.out.println("例外通知"); ex.printStackTrace(); } public Object aroundAdvice(ProceedingJoinPoint jp) { Object[] args = jp.getArgs(); if (args.length > 0) { System.out.println("执行环绕通知----" + args[0]); } System.out.println("执行环绕通知前置通知---业务参数" + args[0]); Object o = null; try { o = jp.proceed(); System.out.println("执行环绕通知后置通知---业务参数" + args[0]); } catch (Throwable throwable) { throwable.printStackTrace(); } return o; } }

     

    最新回复(0)