本文主要是对于spring aop简单入门做一些介绍,并不深入了解,只接触表面,对一些较复杂的内容也不过多描述。如文中有错误之处,望不吝赐教,谢谢~
一、AOP常用通知类型
- 前置通知
在切入点方法执行之前执行执行的通知。 - 后置通知
在切入点方法执行之后执行执行的通知。 - 异常通知
在切入点方法执行之后发生异常执行的通知(注意后置通知和异常通知同时只存在一个)。 - 最终通知
在切入点方法执行之后执行执行的通知。
和后置通知不同之处在于,后置通知是在方法正常返回后执行的通知,如果方法没有正常返回,例如抛出异常,则后置通知不会执行。而最终通知无论如何都会在目标方法调用过后执行,即使目标方法没有正常的执行完成。 - 环绕通知
在切入点方法执行之前和之后都可以执行额外代码的通知,根据这一特性,可以借助环绕通知实现其他四种通知。
二、实例
在上一篇文章Spring AOP简单入门学习(一)的项目基础上进行展开。
(1)修改Logger.java
package com.example.utils;
public class Logger {
/**
* 前置通知
*/
public void beforePrintLog(){
System.out.println("打印日志-前置通知");
}
/**
* 后置通知
*/
public void afterReturningPrintLog(){
System.out.println("打印日志-后置通知");
}
/**
* 异常通知
*/
public void afterThrowingPrintLog(){
System.out.println("打印日志-异常通知");
}
/**
* 最终通知
*/
public void afterPrintLog(){
System.out.println("打印日志-最终通知");
}
}
(2)修改bean.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
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd">
<!--配置ioc-->
<bean id="userService" class="com.example.service.impl.UserServiceImpl"/>
<bean id="logger" class="com.example.utils.Logger"/>
<!--配置aop-->
<aop:config>
<!--配置切面 id提供唯一标识 ref指定某一bean-->
<aop:aspect id="logAdvice" ref="logger">
<!--配置前置通知 -->
<aop:before method="beforePrintLog"
pointcut="execution(* com.example.service.impl.*.*(..))"/>
<!--配置后置通知 -->
<aop:after-returning method="afterReturningPrintLog"
pointcut="execution(* com.example.service.impl.*.*(..))"/>
<!--配置异常通知 -->
<aop:after-throwing method="afterThrowingPrintLog"
pointcut="execution(* com.example.service.impl.*.*(..))"/>
<!--配置最终通知 -->
<aop:after method="afterPrintLog"
pointcut="execution(* com.example.service.impl.*.*(..))"/>
</aop:aspect>
</aop:config>
</beans>
(3)在saveUser()里面构造一个异常的语句
int i=1/0;
(4)执行AopTest,结果如下
测试成功。注意后置通知和异常通知同时只能有一个执行。
(5)在Logger.java里面添加环绕通知方法
/**
* 环绕通知
*/
public Object aroundPrintLog(ProceedingJoinPoint pjp){
Object returnValue=null;
try {
Object[] args=pjp.getArgs();
System.out.println("打印日志-环绕通知-前置通知");
returnValue=pjp.proceed(args);
System.out.println("打印日志-环绕通知-后置通知");
return returnValue;
}catch (Throwable throwable) {
System.out.println("打印日志-环绕通知-异常通知");
throwable.printStackTrace();
throw new RuntimeException(throwable);
}finally {
System.out.println("打印日志-环绕通知-最终通知");
}
}
(6)在bean.xml中配置环绕通知
<!--配置环绕通知 -->
<aop:around method="aroundPrintLog"
pointcut="execution(* com.example.service.impl.*.*(..))"/>
(7)执行AopTest,结果如下:
2020.03.21