「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战」
一、AOP介绍以及诞生初衷
1.1 什么是AOP
AOP(Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。(来自百度)
简单来说的话,Spring使用容器来管理类,这些容器使用配置文件来灵活配置,(AOP)就是在执行这些容器的时候提前或者延迟执行一些方法。
1.2 诞生之初是为了什么
首先,AOP的主要功能有:
日志记录,性能统计,安全控制,事务处理,异常处理、活动有效性检测等等
来个 “AOP进化史” 吧,上图!
- 进化前
- 进化后 可以看到,经过“进化后”,接口就只需要关心具体的业务,而不需要关注其他非该接口关注的逻辑或处理。
二、AOP术语
任何可以算的上理论的理论,都必须借助术语. 而且任何理论的发展,都必须不断创造出新术语,并以此为脚手架. 下面的理论有个印象就好,在实际中再进行领悟就好。
- 通知(Advice):通知定义了切面是什么以及何时使用。何时:某个方法调用前?调用后?之前之后都调用?还是只是方法抛出异常时调用?Spring切面可以应用5种类型的通知:前置通知、后置通知、返回通知、异常通知、环绕通知。(before,after,afterReturning,afterThrowing,around)
- 连接点(JoinPoint):指的是在应用程序执行过程中能够插入的位置;程序执行过程中明确的点,一般是方法的调用
- 切入点(PointCut):切入点是建立在连接点基础上的,例如有十个方法,每个方法的调用前后等都是连接点,但你只想在某个方法的调用前织入通知,那么就可以使用切点来定义这个方法。通过切点对连接点进行定义,从而筛选出你想要织入通知的连接点;就是带有通知的连接点,在程序中主要体现为书写切入点表达式
- 切面(Aspect):切面是通知和切点的结合。通知定义了什么时候干什么事,切点定义了在哪干,通知和切点共同组成了完整的切面;通常是一个类
- 引入(Introduction):允许我们向现有的类中添加新的方法。结合上面的几个术语,其实就是将切面应用到具体的目标类中;
- 织入(Weaving):把切面应用到目标对象时创建新的代理对象的过程,有三种织入方法:编译期织入,装载期织入和运行时织入
- AOP Proxy:AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类。
三、AOP注解介绍
注解 | 解释 | 应用 |
---|---|---|
@Aspect | 表示当前类是一个切面类 | 标注在类上 |
@PointCut | 切入点 | 被@PointCut标注的方法的实际内容其实并不重要,实际上应该是空的,该方法本身只是一个标识 |
@Before | 前置通知 | 即在某个连接点之前执行通知 |
@AfterReturning | 后置通知 | 即在某个连接点正常完成后执行通知,通常在一个匹配的方法返回的时候执行 |
@AfterThrowing | 异常通知 | 即在方法抛出异常退出时执行通知 |
@After | 最终通知 | 即某个连接点退出时执行通知 |
@Around | 环绕通知 | 它是最强大也是最麻烦的通知,它可以在方法调用前后完成自定义的行为,它可以自己选择是否继续执行连接点或者直接返回或者抛出异常来结束执行 |
四、总结
以上内容是基础中的基础,也是在学习工作比较常见的知识点,了解了AOP是什么以及AOP可以解决什么问题,同时也在变秃的路上更进一步。