AOP概念及相关术语
AOP是一种设计思想,是软件设计领域中的面向切面编程,是面向对象编程的一种补充和完善。
1 . AOP的作用
下面两点是同一件事的两面,一枚硬币的两面:
-
-
代码增强:把特定的功能封装到切面类中,看哪里有需要,就往上套,被套用了切面逻辑的方法就被切面给增强了。
2 . 相关术语
抽:把非核心业务代码封装到当前切面类中进行管理
套:把抽出来的代码套用到当前抽取出来的位置,就能达到不修改源代码的情况下给
程序动态统一添加额外功能的一种技术。
所以AOP底层实现的就是代理模式。
①横切关注点
从每个方法中抽取出来的同一类非核心业务。在同一个项目中,
我们可以使用多个横切关注点对相关方法进行多个不同方面的增强。
(从核心业务代码中所抽取出来的非核心代码,例:计算器里面所写的日志功能,
这个日志功能就是当前核心功能中的非核心业务代码)。
这个概念不是语法层面天然存在的,
而是根据附加功能的逻辑上的需要:有十个附加功能,就有十个横切关注点。

②通知(方法)
通知:把横切关注点收集(封装)到一个类中,这个类就叫做切面。
切面里面所封装的每一个横切关注点都是一个通知
(非核心业务代码在目标对象中叫做横切关注点,把他抽取出来后,放到切面类里面进行封装),
那横切关注点在切面中表示一个通知方法。
每一个横切关注点上要做的事情都需要写一个方法来实现,这样的方法就叫通知方法。
横切关注点是针对目标对象说的。
通知是针对切面说的。
-
前置通知:在被代理的目标方法前执行
-
返回通知:在被代理的目标方法成功结束后执行
-
异常通知:在被代理的目标方法异常结束后执行
-
后置通知:在被代理的目标方法最终结束后执行
-
环绕通知:使用try...catch...finally结构围绕整个被代理的目标方法,包括上面四种通知对应的所有位置
③切面
封装通知方法的类 (封装横切关注点的类)
因为对于ioc来说,就是普通组件,现在要告诉ioc容器他是切面组件,所以在切面里面加入注解@Aspect
根据不同的非核心业务逻辑,我们可以创建不同的切面类:
-
日志功能:日志切面
-
缓存功能:缓存切面
-
事务功能:事务切面

④目标
被代理的目标对象。
指的是当前目标对象,进行功能增强的对象,
就是进行抽取非核心业务代码的这个对象。
⑤代理
向目标对象应用通知之后创建的代理对象。
代理:为当前目标对象所创建出来的代理对象。在AOP自动创建的。
⑥连接点
和横切关注点一样,这又是一个纯逻辑概念,不是语法定义的。
就是抽取横切关注点的位置。
横切关注点从哪抽取出来的。
为什么要知道连接点:AOP面向切面编程,不是要光抽的,从哪抽出来的,就要套在哪。

⑦切入点
定位连接点的方式。
我们通过切入点,可以将通知方法精准的植入到被代理目标方法的指定位置。
每个类的方法中都包含多个连接点,所以连接点是类中客观存在的事物(从逻辑上来说)。
如果把连接点看作数据库中的记录,那么切入点就是查询记录的 SQL 语句。
Spring 的 AOP 技术可以通过切入点定位到特定的连接点。
切点通过 org.springframework.aop.Pointcut 接口进行描述,它使用类和方法作为连接点的查询条件。
在AOP里面要干的事情:从目标对象中把非核心业务代码抽取出来,那非核心业务代码就叫横切关注点,
抽取完后放到一个类里面,这个类叫做切面,在切面中如何封装当前横切关注点,
而每一个横切关注点都是一个方法,这个方法就叫通知。切面有了,
切面是用来封装通知的,而通知就是横切关注点,就是抽出来的非核心业务代码,
不光只是抽,抽完之后目标对象没有这个功能了,是不改变源代码的基础上做功能增强,
不但要把这个功能抽出来,还需要把他套到当前目标对象上,所以从哪抽出来的,就要套在哪。
如果是目标对象执行之前或后,就要套到抽取横切关注点的位置,这个位置叫做连接点,
但连接点就是概念就是位置,从代码层面定位定位连接点,要用到切面点。
AOP:抽和套 抽横切关注点,封装到切面中,就是一个通知,在通过切入点定位到连接点,
就可以在不改变目标对象代码的同时把当前切面中的通知通过切入点表达式套到连接点上,来实现功能增强。
面向对象抽的是一段连续的代码
用面向切面来抽,因为是分布在功能执行的过程中,而不是一段连续的代码。
作用:
简化代码:把方法固定位置的重复的代码 抽取出来,让被抽取的方法更专注于自己的核心功能,提供内聚性。
浙公网安备 33010602011771号