什么是AOP?
AOP全称Aspect Oriented Programming
意为面向切面编程,也叫做面向方法编程,是通过预编译方式和运行期动态代理的方式实现不修改源代码的情况下给程序动态统一添加功能的技术。
AOP技术利用一种称为“横切”的技术,剖解开封装对象的内部,将影响多个类的公共行为封装到一个可重用的模块中,并将其命名为Aspect
切面。所谓的切面,简单来说就是与业务无关,却为业务模块所共同调用的逻辑,将其封装起来便于减少系统的重复代码,降低模块的耦合度,有利用未来的可操作性和可维护性。
利用AOP可以对业务逻辑各个部分进行隔离,从而使业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高开发效率。
AOP的使用场景主要包括日志记录、性能统计、安全控制、事务处理、异常处理等。
例如:日志功能,日志代码往往横向散布在所有对象层次中,而与之对应的对象的核心功能毫无关系。对于其他类型的代码,如安全性、异常处理、透明的持续性等也都是如此,这种散布在各处而且无关的代码被称为横切(cross-cutting)。在OOP设计中,它们会导致大量重复的代码,不利用模块的重用。
例如:银行系统的取款流程和查询余额的流程中都有存在相同的验证流程
AOP与OOP有什么关系呢?
AOP和OOP是面向不同领域的两种思想,OOP面向对象编程主要是针对业务处理过程中的实体的属性和行为的抽象与封装,以获得更加清晰高效地逻辑单元。AOP面向切面编程是针对业务处理过程中的切面进行提取,它所面对的是处理过程中某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。
AOP可以说是OOP的补充和完善,OOP引入封装、继承、多态等概念建立了一种对象层次结构,用来模拟公共行为的一个集合。当需要为分散的对象引入公共行为的时候,OOP显得无能为力,也就是说,OOP允许定义从上到下的关系,但并不适合定义从左到右的关系。
AOP的本质是什么呢?
AOP是实现分散关注的编程方法,将关注封装在切面中。如何分散关注呢?将需求功能从不相关的类中分离出来,同时使多个类共用一个行为,一旦行为发生变化,不必修改多个类,只修改行为即可。
AOP将软件系统划分为两个部分:核心关注点、横切关注点,业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的特点是经常发生在核心关注点的多个位置,而且它们功能基本相似。AOP的作用在于分离系统中的各个关注点,将核心关注点和横切关注点分离开来。
AOP只是一个概念并没有设定具体语言的实现,它能克服那些只有单继承特性语言的缺点。实现AOP的技术主要分为两类:一类是采用动态代理技术利用截取消息的方式,对消息进行装饰以取代原有对象行为的执行。另一类是采用静态织入的方式,引入特定语法创建切面,从而使编译器可以在编译期间织入相关的切面代码。
AOP运行原理是什么样的呢?
AOP核心概念有哪些呢?
- 横切关注点
对哪些方法进行拦截,拦截后怎样处理。
-
Aspect
切面
切面是散落在系统各处通用的业务逻辑代码,如日志模块、权限模块、事务模块等。
切面用来装载切入点PointCut
和通知Advice
切面通常是一个类,可以定义切入点和通知。类是对物体特征的抽象,切面是对横切关注点的抽象。
切面是业务流程运行的某个特定步骤,是应用运行过程中的关注点,关注点通常会横切多个对象,因此也被称为横切关注点。
-
JointPoint
连接点
连接点是程序执行过程中明确的点,一般是类中方法的调用。连接点是程序在运行过程中能够插入切面的地点,比如方法调用、异常抛出、字段修改等。
-
Advice
通知
通知是AOP在特定切入点上执行的增强处理,是拦截到连接点之后要执行的代码,通知可以分为前置通知Before
、后置通知AfterReturning
、异常通知AfterThrowing
、最终通知After
、环绕通知Around
五类。
-
PointCut
切入点
切入点是带有通知的连接点,在程序中主要体现为编写切入点表达式。切入点是对连接点进行拦截的定义。切入点用于定义通知应该切入到哪些连接点上,不同的通知需要切入到不同的连接点上,这种精准的匹配是由切入点的正则表达式来定义的。
切入点是可以插入增强处理的连接点,当某个连接点满足执行要求时,该连接点将被连接增强处理,该连接点也就变成了切入点。
切入点是拦截的方法,连接点JointPoint
拦截后将变成切入点。
-
Proxy
代理对象
代理对象是AOP创建的对象,包含通知,代理是目标对象的加强。 代理是将通知应用到目标对象之后被动态创建的对象,可以简单理解代理对象的功能等同于目标对象的核心业务逻辑功能加上共有功能。代理对象对于使用者而言是透明的,是程序运行过程中的产物。
-
Weaving
织入
通过切入点切入,将切面应用到目标对象并导致代理对象创建的过程。将切面应用到目标对象从而创建一个新的代理对象的过程,这个过程可以发生在编译器、类转载期、运行期,不同的发生点有着不同的前提条件。如果发生在编译器就需要有一个支持这种AOP实现的特殊编译器,发生在类转载期就需要有一个支持AOP实现的特殊类转载其,发生在运行期则可以直接通过反射机制与动态代理机制来动态实现。
-
Target
目标对象
目标对象是指代理的目标对象,是指要织入的对象模块。目标对象是那些即将切入切面的对象,也就是被通知的对象。这些对象中已经只剩下干干净净的核心业务逻辑代码,所有的共有功能等待AOP容器的切入。
目标对象是AOP进行增强处理的对象,也被称为增强的对象。如果AOP是通过运行时代理来实现的,那么这个对象将是一个被代理的对象。
AOP是典型的代理模式的体现,代理模式的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、将消息转发给委托类、事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象相关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象方法来提供特定的服务。
未完待续...