AOP
(
Aspect Oriented Programming
)是一种设计思想,是软件设计领域中的面向切面编程,它是面向对象编程的一种补充和完善,它以通过预编译方式和运行期动态代理方式实现在不修改源代码的情况 下给程序动态统一添加额外功能的一种技术。
2 .相关术语
①横切关注点
从每个方法中抽取出来的同一类非核心业务。在同一个项目中,我们可以使用多个横切关注点对相关方 法进行多个不同方面的增强。 这个概念不是语法层面天然存在的,而是根据附加功能的逻辑上的需要:有十个附加功能,就有十个横 切关注点。
②通知
把横切关注点封装到切面中,而在切面里面,每一个横切关注点,他都表示为一个通知方法
通知:
把横切关注点收集到一个类中,把横切关注点封装到当前的一个类中,然后这个类就叫做切面,而在这个切面里面 我们所封装的每一个横切关注点都是一个通知,换句话入,非核心业务代码,在我们的目标对象中,他叫做横切关注点,把非核心业务代码抽取出来之后 把非核心业务代码放在一个切面类中进行封装,那我们当前横切关注点放在切面中,就表示一个通知方法
每一个横切关注点上要做的事情都需要写一个方法来实现,这样的方法就叫通知方法。
前置通知:在被代理的目标方法
前
执行
返回通知:在被代理的目标方法
成功结束
后执行(
寿终正寝
)
异常通知:在被代理的目标方法
异常结束
后执行(
死于非命
)
后置通知:在被代理的目标方法
最终结束
后执行(
盖棺定论
)
环绕通知:使用
try...catch...finally
结构围绕
整个
被代理的目标方法,包括上面四种通知对应的所
有位置
③切面
封装通知方法的类。
切面用来封装横切关注点,切面封装横切关注点之后 一个横切关注点就表示一个通知方法
换句话说,封装横切关注点的类 就叫做切面,也可以说通知方法的类,就叫做切面 因为横切关注点是相对对象说的 通知是相对于切面说的
把横切关注点抽取出来放在切面里面之后 我们就要把他写成一个通知方法
④目标
我们要进行功能增强的对象 也就是我们现在要抽取非核心代码的对象 这就叫做目标对象
被代理的目标对象。
⑤代理
向目标对象应用通知之后创建的代理对象。
为当前的目标对象 所创建出来的代理对象 在AOP里面 我们的代理对象 不用我们自己创建 因为他封装的是一个代理模式 所以我们不用在手动的去创建代理对象 我们也不用手动的去创建一个代理的工厂 代理是AOP来帮助我们创建的
所以我们的AOP叫做 面向切面工程 切面是最重要的 主要找到目标对象后 然后根据需求 找到横切关注点 把他封装到一个类中 这个类就叫做切面
封装到一个类中 我们的每一个横切关注点 我们都要把它写成一个方法 而这个方法就叫做通知
⑥连接点
这也是一个纯逻辑概念,不是语法定义的。
把方法排成一排,每一个横切位置看成
x
轴方向,把方法从上到下执行的顺序看成
y
轴,
x
轴和
y
轴的交叉 点就是连接点。
抽取横切关注点的位置 当前的横切关注点是从哪里抽取出来的 比如下图 我们是add(加法运算中抽取出来的)从方法执行之前抽取出来 这就是一个连接点
或是有异常时候抽取出来的 这就是第二个连接点
所以连接点 就是抽取横切关注点的位置
为什么要知道连接点:
我们要抽取出来 我们哪里抽取的的 就要套到哪里 这才是不改变代码的情况下 进行一个功能的增强
⑦切入点
切入点 就是表达式
切入点是从代码层面来说的
定位连接点的方式。
每个类的方法中都包含多个连接点,所以连接点是类中客观存在的事物(从逻辑上来说)。
如果把连接点看作数据库中的记录,那么切入点就是查询记录的
SQL
语句。
Spring
的
AOP
技术可以通过切入点定位到特定的连接点。
切点通过
org.springframework.aop.Pointcut
接口进行描述,它使用类和方法作为连接点的查询条
件。
3 .作用
简化代码:把方法中固定位置的重复的代码
抽取
出来,让被抽取的方法更专注于自己的核心功能,
提高内聚性。
代码增强:把特定的功能封装到切面类中,看哪里有需要,就往上套,被
套用
了切面逻辑的方法就
被切面给增强了。