【Spring AOP】Spring AOP 基础(一)

摘要:本篇文章主要介绍了 AOP 的基本概念,使用场景和 AOP 的八个术语。AOP 是面向切面编程的意思,全称为Aspect Oriented Programming。它是一种可以在不改变原来代码的基础上,通过动态注入代码,来改变原来执行结果的技术。实际的应用场景有权限处理、日志记录、性能统计、安全控制、事务处理、异常处理等。重点对连接点(JoinPoint)、切入点(Pointcut)、通知(Advice)、AOP 代理(AOP Proxy)、织入(Weaving)、切面(Aspect)等的术语介绍。

AOP 简介

AOP ( Aspect Oriented Programming)是面向切面编程的意思。AOP 是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。它是基于 OOP 之上的一种编程范式,是函数式编程的一种衍生范型,是OOP(Object Oriented Programming,面向对象编程)的延续、补充和完善。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

简单的来讲,AOP 是一种可以在不改变原来代码的基础上,通过动态注入代码,来改变原来执行结果的技术。

使用场景

实际的开发的场景中,对于冗余的代码完全可以利用 AOP 技术来提高程序的可重用性和开发效率。代码中类似事务和分页这些具有共性的代码,完全可以抽离出来使用 AOP 实现。

举个简单例子,利用 AOP 实现分页功能可以达到零代码入侵的目的,只需要在请求方法上传入对应的分页请求数据即可,SQL 的编写以及后台业务与分页代码无关。

  • 场景一: 事务处理。
  • 场景二:权限验证。
  • 场景三:日志记录。
  • 场景四:性能统计。
  • 场景五:缓存处理。
  • 场景六:异常处理。
  • 场景七:分页处理。

AOP 与 OOP 的区别

  • 设计思想上的不同。OOP(面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。
    而 AOP 则是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。这两种设计思想在目标上有着本质的差异。
  • 两者扬长补短,互相结合。OOP 实际上是对对象的属性和行为的封装,而 AOP 对于这点就无从谈起,但是 AOP 是处理某个步骤和阶段的,从中进行切面的提取,如果几个或更多个逻辑过程中,有重复的操作行为,AOP 就可以提取出来,运用动态代理,实现程序功能的统一维护。 AOP 并不是与OOP 对立的,而是为了弥补 OOP 的不足。OOP 解决了竖向的问题,AOP 则解决横向的问题。没有谁优谁劣,只有扬长补短,互相结合。

  • 在 OOP 中, 我们以类 (class) 作为我们的基本单元, 而 AOP 中的基本单元是 Aspect(切面)。

AOP 术语

连接点(JoinPoint)

a point during the execution of a program, such as the execution of a method or the handling of an exception. In Spring AOP, a join point always represents a method execution.

程序运行中的一些时间点,例如一个方法的执行,或者是一个异常的处理。在 Spring AOP 中,join point 总是方法的执行点, 即只有方法连接点。程序运行过程中,JVM负责程序运行,执行到某个方法时,JVM 能识别当前执行的是哪个方法,这些定义在类中的方法,每个具有独立的功能,在AOP 中,将这些具有特定功能的方法称为连接点。

切入点(Pointcut)

  • 类中的方法具有很多,某些方法具有一些共同的流程,例如数据库连接的获取与关闭,事务的开启与提交等等。将这些公共的特性抽取出来,抽取完 毕后,原始方法中就缺少了这些被抽取的代码。在实际运行时,缺少这些代码是无法完成原始的功能的。这些被抽取了公共功能的方法称为切入点。
  • 切入点一定是连接点,连接点不一定是切入点。
  • 切入点指被抽取了共性功能的方法。

通知(Advice)

  • 切入点对应的方法的共性功能被抽取后,组成独立代码逻辑,被封装在某个类的某个方法中,在被抽取了共性功能的方法被执行时,这些代码逻辑还要加入原始方法的执行,这些被抽取出来组成独立代码逻辑的共性功能称为通知。

  • 共性功能被抽取后,可能来自于切入点对应的方法中的任何位置,因此通知不仅描述共性的代码逻辑, 还是描述被抽取时从何处抽取。例如切入点代码逻辑的前面、中间还是后面,被抽取的代码在切入点中的具体位置,称为通知类别。

引入 (Introduction)

  • 通知仅表示切入点被抽取的代码逻辑,对于切入点所在的类,如果存在有共性的成员变量或者成员方法,通知将无法进行描述。
  • AOP 提供引入机制,将共性功能的成员进行加入。引入机制可以为类添加额外的成员变量或者成员方法,该引入机制是在编译期或类加载期完成的。

目标对象(Target Object)

  • 切入点对应的共性功能被抽取后创建独立的通知完成共性功能,在程序运行时,动态的为类对象执行切入点方法时动态加入被抽取的共性功能,此时需要使用代理的模式完成。此时被代理创建的对象, 称为目标对象。
  • 目标对象指包含切入点的类对象。

AOP 代理(AOP Proxy)

  • 切入点所在的类对象执行切入点方法时,需要将原始的共性功能(通知)加入,此时通过代理的形式创建类对象,并完成共性功能(通知)的加入,上述过程称为 AOP 代理。
  • AOP 代理的意义是将被抽取共性功能的类对象创建出,同时将共性功能(通知)加入,完成原始的完整操作的执行过程。

织入(Weaving)

  • 通过 AOP 代理,完成了切入点与通知的融合,并组成了完整的代码逻辑,将通知加入到切入点对应位置的动作称为织入。
  • 织入是一个动态过程,不对应任何代码,可以理解为动态的运行过程。
  • 织入可以在三个阶段进行,编译时,类加载时,运行时。Spring 采用的是运行时织入。

切面(Aspect)

  • 切面是一个设计概念,指切入点与通知的匹配模式, 换句话说指被抽取了共性功能的方法(切入点)与被抽取了共性功能(通知)对应的绑定关系。
  • 程序设计时,可以设置多个切面,用来描述切入点与通知之间的关系。

关于 AOP 术语的总结:

  • 连接点(JoinPoint)(类中的所有方法)
  • 切入点(Pointcut)(确定共性功能代码的方法)
  • 通知(Advice)(被抽取的共性组成的代码逻辑,通知方法和通知类,有位置区分)
  • 引入 (Introduction)(通知只能抽取逻辑,引入变量到切入点方法中的时候就需要使用引入)
  • 目标对象(Target Object)(切入点方法的对象)
  • AOP 代理(AOP Proxy)(代理目标对象)
  • 织入(Weaving)(代理目标对象把通知织入到目标对象的切入点方法,是一个动作)
  • 切面(Aspect)(通知和切入点的关系,一个连接通知和切入点的面。)

AOP工作流程

  • 开发阶段(开发者完成) 将共性功能独立开发出来,制作成通知将非共性功能开发到对应的目标对象类中,并制作成切入点方法在配置文件中,声明切入点与通知间的关系,即切面。

  • 运行阶段( AOP 完成) JVM 读取配置文件中的信息,监控切入点方法的执行一旦监控到切入点方法被运行,使用代理机制,动态创建目标对象的代理对象,根据通知类别,在代理对象的对应位置, 将通知对应的功能织入,完成完整的代码逻辑运行。

参考文章

彻底征服 Spring AOP 之 实战篇
彻底征服 Spring AOP 之 理论篇

相关推荐

Leave a Reply

Your email address will not be published. Required fields are marked *

微信扫一扫,分享到朋友圈

【Spring AOP】Spring AOP 基础(一)
返回顶部

显示

忘记密码?

显示

显示

获取验证码

Close