关于Spring的环绕通知,按照我的理解就是通过代码的形式来实现切入点的4种通知。 它是spring框架为我们提供的一种可以在代码中手动控制增强方法何时执行的方式。
首先在配置文件加入环绕通知的配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <bean id="UserServicr" class="com.itylm.service.impl.UserServiceImpl"></bean> <bean id="Logger" class="com.itylm.util.Logger"></bean> <aop:config> <aop:pointcut id="pt1" expression="execution( * com.itylm.service.impl.*.*(..))"/> <aop:aspect id="logAdvice" ref="Logger"> <!-- 配置前置通知:在切入点方法执行之前执行--> <aop:around method="aroundPringLog" pointcut-ref="pt1"></aop:around> </aop:aspect> </aop:config> </beans>
去编写日志类
public class Logger { public Object aroundPringLog(ProceedingJoinPoint pjp){ Object rtValue = null; try{ Object[] args = pjp.getArgs();//得到方法执行所需的参数 System.out.println("前置通知"); rtValue = pjp.proceed(args);//明确调用业务层方法(切入点方法) System.out.println("后置通知"); return rtValue; }catch (Throwable t){ System.out.println("异常通知"); throw new RuntimeException(t); }finally { System.out.println("最终通知"); } } } Spring框架为我们提供了一个接口:ProceedingJoinPoint。该接口有一个方法proceed(),此方法就相当于明确调用切入点方法。 该接口可以作为环绕通知的方法参数,在程序执行时,spring框架会为我们提供该接口的实现类供我们使用。