# AOP 核心概念
连接点(JoinPoint):程序执行过程中的任意位置,粒度为执行方法、抛出异常、设置变量等
- 在 SpringAOP 中,理解为方法的执行
切入点(Pointcut):匹配连接点的式子
- 在 SpringAOP 中,一个切入点可以描述一个具体方法,也可也匹配多个方法
- 一个具体的方法:如 com.itheima.dao 包下的 BookDao 接口中的无形参无返回值的 save 方法
- 匹配多个方法:所有的 save 方法,所有的 get 开头的方法,所有以 Dao 结尾的接口中的任意方法,所有带有一个参数的方法
连接点范围要比切入点范围大,是切入点的方法也一定是连接点,但是是连接点的方法就不一定要被增强,所以可能不是切入点。
- 在 SpringAOP 中,一个切入点可以描述一个具体方法,也可也匹配多个方法
通知(Advice):在切入点处执行的操作,也就是共性功能
- 在 SpringAOP 中,功能最终以方法的形式呈现
通知类:定义通知的类
切面(Aspect):描述通知与切入点的对应关系
# 知识点 1:@EnableAspectJAutoProxy
名称 | @EnableAspectJAutoProxy |
---|---|
类型 | 配置类注解 |
位置 | 配置类定义上方 |
作用 | 开启注解格式 AOP 功能 |
# 知识点 2:@Aspect
名称 | @Aspect |
---|---|
类型 | 类注解 |
位置 | 切面类定义上方 |
作用 | 设置当前类为 AOP 切面类 |
# 知识点 3:@Pointcut
名称 | @Pointcut |
---|---|
类型 | 方法注解 |
位置 | 切入点方法定义上方 |
作用 | 设置切入点方法 |
属性 | value(默认):切入点表达式 |
# 知识点 4:@Before
名称 | @Before |
---|---|
类型 | 方法注解 |
位置 | 通知方法定义上方 |
作用 | 设置当前通知方法与切入点之间的绑定关系,当前通知方法在原始切入点方法前运行 |
# AOP 工作流程
- Spring 容器启动
- 读取所有切面配置中的切入点
- 初始化 bean
- 获取 bean,执行方法
- 目标对象 (Target):原始功能去掉共性功能对应的类产生的对象,这种对象是无法直接完成最终工作的
- 代理 (Proxy):目标对象无法直接完成工作,需要对其进行功能回填,通过原始对象的代理对象实现
目标对象就是要增强的类对应的对象,也叫原始对象,不能说它不能运行,只能说它在运行的过程中对于要增强的内容是缺失的。
SpringAOP 是在不改变原有设计(代码)的前提下对其进行增强的,它的底层采用的是代理模式实现的,所以要对原始对象进行增强,就需要对原始对象创建代理对象,在代理对象中的方法把通知内容加进去,就实现了增强,这就是我们所说的代理(Proxy)。
# AOP 切入点表达式
# 语法格式
- 切入点:要进行增强的方法
- 切入点表达式:要进行增强的方法的描述方式
切入点表达式标准格式
- 动作关键字 (访问修饰符 返回值 包名。类 / 接口名。方法名 (参数) 异常名)