一:什么是Spring Aop?
Aop:面向切面编程,它是一种思想,他是对某一类事情的集中处理,针对某一方面的问题进行集中处理。
Spring Aop是一种框架,提供了对Aop思想的实现。
二:Aop常见的使用场景
1:用户登录判断
2:统一日志记录(计算方法的执行次数)
3:统计方法执行时间统计(分析和排查系统的问题)
4:统一的返回格式设置(前后端数据一致性)
eg:一个前端对应四个后端,四个后端返回数据的格式不一样,前端必须处理四个后端的数据格式,很麻烦,所以要统一的返回格式相同。
5:统一的异常处理
6;事务的开启和提交
三:开启学习Spring Aop之旅
3.1:Aop的组成
3.1.1:切面
切面:由切点和通知组成,既包含了横切逻辑的定义,也包含连接点的定义。
切面是包含了通知,切点,切面的类,相当于Aop实现某个功能的集合。
3.1.2:连接点
连接点:应用执行过程中能够插入的一个点。
3.1.3:切点
切点:是匹配连接点的谓词。
提供一组规则,来匹配连接点,给满足的连接点添加通知。
3.1.4:通知
通知:切面也是有它的目标的,即要完成的工作。切面的工作被称为通知。
3.1.4.1:前置通知
前置通知:在目的方法执行前执行的通知,叫做前置通知。
以上图为例,假设user要发送文章,要经过两步,先进行登录,再发送文章。在没学习Aop之前,我们会在添加文章的方法里面添加登录方法。即发送 文章的方法为目标方法,而登录这一操作可以放在Aop当中,被称为前置通知,如果登录成功,则发送文章,如果登录失败,则返回错误提示。
3.1.4.2:后置通知
后置通知:将目标方法执行完之后,所执行的通知成为后置通知。
举个栗子:
当jdbc使用完之后,释放资源,此时,释放资源可以放在aop中。
3.1.4.3:异常通知
异常通知:在执行目标方法时,执行的通知。
3.1.4.4:返回通知
返回通知:目标方法执行了返回数据(return),执行的通知。
3.1.4.5:环绕通知
环绕通知: 在目标方法执行前中后,都可以执行的通知,就叫做环绕通知。
3.2:实现Spring Aop
3.2.1添加Aop框架支持
手动在pom.xml添加Aop依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
3.2.2定义切面和切点
注意:
1:在根目录下创建切面
2:此类随着框架的启动而启动,所以要加5大类注解吗,此处推荐组件的注解
3:此类是一个切面,需要在类的上面添加@Aspect这个注解,告诉spring是一个切面
@Component//随着框架的启动而启动 @Aspect//告诉spring框架,是一个切面的类 public class UserAspect { //定义切点,定义拦截的规则 @Pointcut("execution(* com.example.demo12.controller.UserController.*(..))") public void pointcut(){}; }
3.2.3:定义通知
在切面这个类进行添加通知:
//定义通知 //前置通知。这个通知针对哪个切点的 @Before("pointcut()") public void BeforeAdvice(){ System.out.println("执行了前置通知"); } //后置通知 @After("pointcut()") public void AfterAdvice(){ System.out.println("执行了后置通知"); }
运行结果:执行了目的方法的前置通知之后,执行了目的方法,再执行后置方法。
3.3.4定义环绕通知
@Around("pointcut()") public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable { System.out.println("进入环绕通知了"); Object obj=null; //执行目标方法 obj = joinPoint.proceed(); System.out.println("退出环绕通知"); return obj; }
3.3.5:切点表达式