spring的环绕通知可以让我们手动的控制增强的代码
我们来在配置文件中只需要<aop:around method="arruondPrintLog" pointcut-ref="pt1"/>
xml配置文件如下
<?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: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/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- spring配置ioc-->
<bean id="accountService" class="com.lp.service.impl.AccountServiceImpl"/>
<bean id="logger" class="com.lp.utils.Logger"/>
<aop:config>
<!--配置切入点表达式-->
<aop:pointcut id="pt1" expression="execution(* com.lp.service.impl.*.*(..))"/>
<aop:aspect id="logAdvice" ref="logger">
<!-- 配置前置通知(在切入点方法执行之前执行)-->
<!--<aop:before method="beforePrintLog"
pointcut-ref="pt1"></aop:before>
<!– 配置后置通知(在切入点方法执行之后执行)–>
<aop:after-returning method="afterReturningPrintLog"
pointcut-ref="pt1"></aop:after-returning>
<!– 配置异常通知(在切入点方法产生异常时执行)–>
<aop:after-throwing method="afterThrowingPrintLog"
pointcut-ref="pt1"></aop:after-throwing>
<!– 配置最终通知(无论切入点方法是否正常执行,他都会在其后面执行)–>
<aop:after method="afterPrintLog"
pointcut-ref="pt1"></aop:after>-->
<aop:around method="arruondPrintLog" pointcut-ref="pt1"/>
</aop:aspect>
</aop:config>
</beans>
工具类
package com.lp.utils;
import org.aspectj.lang.ProceedingJoinPoint;
/**
* 用于记录日志的工具类,它里面提供了公共方法
*
* @Date 2020/5/29 14:41
* @Author luopeng
*/
public class Logger {
/*
*/
/**
* 前置通知
*//*
public void beforePrintLog() {
System.out.println("前置通知Logger类里面的printLog开始日志输入。。。");
}
*/
/**
* 后置通知
*//*
public void afterReturningPrintLog() {
System.out.println("后置通知Logger类里面的printLog开始日志输入。。。");
}
*/
/**
* 异常通知
*//*
public void afterThrowingPrintLog() {
System.out.println("异常通知Logger类里面的printLog开始日志输入。。。");
}
*/
/**
* 最终通知
*//*
public void afterPrintLog() {
System.out.println("最终通知Logger类里面的printLog开始日志输入。。。");
}
*/
/**
* spring为我们提供了一个接口ProceedingJoinPoint
* 该接口有一个proceed方法,此方法相当于明确调用切入点方法,
* 我们可以将spring提供的接口作为方法参数,我们可调用该接口的实现类方法
*spring中的环绕通知:
* 我们可以手动控制增强方法何时执行
* @param proceedingJoinPoint
* @return
* @throws Throwable
*/
public Object arruondPrintLog(ProceedingJoinPoint proceedingJoinPoint) {
Object rtValue = null;
//获取方法所需参数
Object[] args = proceedingJoinPoint.getArgs();
System.out.println("Logger类里面的printLog开始日志输入。。。前置");
try {
rtValue = proceedingJoinPoint.proceed(args);
System.out.println("Logger类里面的printLog开始日志输入。。。后置");
} catch (Throwable throwable) {
throwable.printStackTrace();
System.out.println("Logger类里面的printLog开始日志输入。。。异常");
}finally {
System.out.println("Logger类里面的printLog开始日志输入。。。最终");
}
return rtValue;
}
}