SpringAOP

AOP是啥?

AOP好IOC一样,都是一种思想,IOC是控制反转,AOP是面向切面编程

面向切面编程?

我们知道,JAVA是面向对象编程,意思是世间万物都可以作为一个对象,面向切面编程的意思就是把一类特定的问题做一个统一的处理,就比如登录的时候的拦截器,统一的登录,异常的统一处理,对某一类特定的问题进行处理,就可以叫做AOP,AOP是一种思想,对一类问题进行处理,拦截器是对AOP思想的具体实现

AOP是一种思想,实现的方法有很多,AspectJ,CGLIB,Spring AOP

举例

现在我要对图书管理项目进行优化,我需要知道每个方法执行的时间,如果在每个方法中都写一份统计时间的代码,那么就会很麻烦,而且后续修改起来难度也大,有没有什么方法可以把它统一起来,让我不需要每个方法都写一遍统计时间的代码?

有的兄弟,有点兄弟,像这么强势的已经存在了-AOP

SpringAOP

导入依赖

在pom文件中,需要添加springAOP的依赖

编写AOP程序

首先需要加一个@Componet注解,把这个类交个Srping管理,然后需要加一个@Aspect注解,表示这个是一个切面

@Arround注解,环绕通知,在目标方法前后都会执行

Execution()表达式表示对哪些方法进行增强

ProceedingJoinPoint 是环绕通知@Arround的专属参数

通过上面的代码我们可以看到,当执行方法的时候,会自动调用recodeTime这个方法,但是在原本的代码中,我并没有进行任何的操作,只是加了一个切面类

  1. AOP的优势
  1. 代码无侵入性,不需要修改现有的代码

  2. 减少重复代码

  3. 方便维护,开发效率提高

SpringAOP详解

概念

切点(pointcut)

切点,也叫做切入点,作用是提供一组规则,告诉程序对哪些方法的哪些功能进行增强

切点表达式

说人话就是按照这个进行筛选,然后筛选出来执行我写的环绕通知

连接点(Join Point)

满足切点表达式规则的方法,就是连接点,就是可以被AOP控制的方法

在这个路径下的所有方法,都称之为连接点

切点VS连接点

切点:规则

连接点:具体的方法

通知(Advice)

AOP面向切面编程中,我们会把重复的代码抽出来,单独定义,这个就是通知的内容

具体要做的事情,如记录耗时的时间(一个方法)

切面(Aspect)

切面 = 切点 + 通知

切面类包括通知的内容,切点的规则

这一整个类,我们就叫做切面类(@Aspect)

通知的类型

具体实现

访问t1

访问结果

通过结果可以看到

程序正常运转的情况下@AfterThrowing不会执行

@Around包含两部分,一个是前置逻辑,一个是后置逻辑

@Before表示会在通知之后执行

@AfterReturning在执行完,没有任何异常

@After最终通知,什么都执行结束了,无论是否抛出异常都结束

@Arround后置通知结束

2.异常情况

当访问的t2的时候,报错

执行Arround,然后执行before然后执行doafterthrowing,再执行after,不执行arround后

为什么不执行around呢,是因为arround环绕通知需要调用proced来执行原方法,需要获取到返回值

@Pointcut

切点表达式:

由于这个切点表达式大量存在且重复,所有spring就提供了一个注解@Pointcut把公共的注解提取出来,需要的时候引入即可

加一个注解@pointcut,把重复的注解写进去,当需要的时候,引用即可

切面优先级@order

如果存在多个切面类的情况下,before字母排名越靠前就越先执行,after越靠后越先执行,为了让我们可以手动指定先后的执行顺序,就有了order注解

加上order注解之后,数字越小的before越先执行,数字越大的after越先执行

示例图

切面1,Before进入前,然后到切面2的before,然后到目标方法,然后到切面2的after,然后才到切面1的after

Execution表达式

对应

访问修饰符合异常可以省略

常见的表达式

@annotation

当存在多个无规则的方法的时候,就需要使用这个注解,execution更时候的是有规则的方法

  1. 编写自定义注解

  2. 使用@annotation表达式来描述切点

  3. 在连接点的方法加上自定义的注解

自定义注解

新建一个Annotation类

Target表示这个类所修饰的对象范围,就是这个注解对什么生效

Retention表示的是这个类存活的时间长短,生命周期

使用

在需要执行的地方加上@annotation(地址)注解

在需要执行的方法中加上自定义注解

结果

总结

  1. AOP是一种思想,对某一类事情的集中处理,Spring框架实现了AOP就叫做SpringAOP,其他的实现就叫做对应的AOP
  2. SpringAOP的常见实现方式有两种

第一种是使用注解@Aspect来实现

第二种是使用自定义注解来实现

相关推荐
专注于大数据技术栈2 小时前
java学习--Collection
java·开发语言·学习
heartbeat..2 小时前
Spring 全局上下文实现指南:单机→异步→分布式
java·分布式·spring·context
techdashen2 小时前
Go 1.18+ slice 扩容机制详解
开发语言·后端·golang
浙江巨川-吉鹏2 小时前
【城市地表水位连续监测自动化系统】沃思智能
java·后端·struts·城市地表水位连续监测自动化系统·地表水位监测系统
froginwe112 小时前
R 包:全面解析与高效使用指南
开发语言
zero.cyx2 小时前
javaweb(AI)-----后端
java·开发语言
鹿角片ljp2 小时前
Java深入理解MySQL数据库操作
java·mysql·adb
NE_STOP2 小时前
SpringBoot集成shiro
java
RemainderTime2 小时前
从零搭建Spring Boot3.x生产级单体脚手架项目(JDK17 + Nacos + JWT + Docker)
java·spring boot·架构