大白话讲解AOP的概念和各个术语(通俗)

最近疫情还是肆虐,新的一年里如果快乐太难,那我祝大家平安,要保重身体哦。

今天来看看AOP的一些基本概念。

先来看看AOP的概念,百度里是这么说的:

在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。(来自百度百科)


说白了AOP就是把程序中公共的代码片段抽取出来,然后动态代理出来一个对象。就像一个函数一样,里面封装了我们的公共代码,我们把要调用的函数传进去,它把我们传进去函数进行增强,然后返回一个调用该函数的对象。

举个例子,我们操作数据库的语句经常就要考虑到事务的控制,不然就没办法保证事务的一致性,后果就会不堪设想!!!

这个时候每个操作数据库的方法都要加入事务控制的代码块,就会有重复的情况,我们的开发就会很冗余。退一万步来讲,就算你能忍,遍好之后并且你可以运行,bingo。但万一以后你改了一个事务方法的名字,那么全部代码块就要跟着改动,那么会非常麻烦,这种代码耦合性特别高。它们方法之间的依赖特别强。我们就要想着如何降低耦合性。

在我之前的博客中说到程序间的耦合大致分为两种,一种是类与类之间的依赖,另外就是方法与方法之间的依赖了。我们降低程序的耦合的话要从这两方面入手,Spring为我们提供两个技术,前者用IOC可以解决,后者就要用到我们今天介绍的AOP了。把公共代码抽取出来,然后动态代理出一个代理对象并返回。这样有个好处,以后如果改了相关方法名,只用改动抽取出来的代码块,而不用大范围改未优化的代码。

而且动态代理的话,还可以在不修改源码的基础上增强代码,如图:
在这里插入图片描述

我们把对事务的操作都封装并抽取出来,这样就可以做到每个对数据库操作的方法都支持事务操作,开发效率也会得到提升。这种方式就是AOP。

接下来在AOP中,有一些的术语,我们以后的实际开发中其实比较少碰到,但是有时我们需要查询一些相关博客或者知识点时需要了解到这些概念。我们还是拿上面那副代码图做例子。(本文尽量采用大白话)

  1. 连接点
    连接点就是被代理类中的所有方法。

  2. 切入点
    切入点是被增强过的方法,注意这里它和连接点的区别,有些方法可能并没有被增强,而是直接返回,这些方法只是连接点,并不是切入点。切入点一定是连接点,连接点不一定切入点。

  3. 增强/通知
    增强也叫通知,从字面上看就是增强的操作。增强分为:前置增强、后置增强、异常增强、最终增强与环绕增强。分类很多,咋一看很有规律。一代码图为例,我们要增强的方法为:

rtValue = method.invoke(accountService,args);

在try代码块中,在这个方法之前所做的操作为前置增强,在这个方法之后所做的为后置增强。在catch代码块中所做操作为异常增强,毕竟是捕获异常呀。在finally中所做的操作为最终增强。而整个合起来称为环绕增强

  1. 目标对象
    被代理的对象

  2. 引介
    引介是一种特殊的增强,它为类添加一些属性和方法。这样,即使一个业务类原本没有实现某个接口,通过AOP的引介功能,我们可以动态地为该业务类添加接口的实现逻辑,让业务类成为这个接口的实现类。

  3. 织入
    织入是将增强添加对目标类具体连接点上的过程

  4. 代理
    代理出来的对象

  5. 切面
    这个感觉特别抽象,就是在XML中描述切入点和其他增强的关系,为什么叫切面呢,一下是我自己个人的猜测:假设有一只猪,一刀下去,我们可以看到横切面,并且可以看到错中复杂的血管和器官的连接,当然这些是玩笑话。

如果各位看到不对的地方,请大家多多帮我指正下啦,蟹蟹哈。

发布了18 篇原创文章 · 获赞 14 · 访问量 3712

猜你喜欢

转载自blog.csdn.net/Jokeronee/article/details/104222037