AOP(面向切面编程)

AOP(面向切面编程)

AOP 含义

面向切面编程:也叫做面向方法编程,通过预编译方式和运行期动态代理的方式实现不修改源代码的情况下给程序动态统一添加功能的技术。

将一些各接口都调用的相同方法抽象为接口,这个接口类似于切面;将方法注入到接口调用的某个地方,这个地方就为切点。

实现AOP的技术主要分为两类:一类是采用动态代理技术利用截取消息的方式,对消息进行装饰以取代原有对象行为的执行。另一类是采用静态织入的方式,引入特定语法创建切面,从而使编译器可以在编译期间织入相关的切面代码。(https://www.jianshu.com/p/f1770b9dce27)

AOP核心概念

横切关注点

横切关注点主要关注于:对哪些方法进行拦截,拦截后怎样处理,是替换还是包装,此外,还有执行的顺序,

切面

ASPECT 切面是散落在系统各处通用的业务逻辑代码,如安全模块、日志模块、认证模块等。

切面可以说是一个较大的概念,较为笼统;更具体的就是切点PointCut和通知Advice,由名字就可知,切点存在于切面上,切面上存在切点,切点又有相应的通知Advice

切面通常是一个类,可以定义切点PointCut和通知Advice。类是对物体特征的抽象,切面是对横切关注点的抽象。

切面是业务流程运行的某个特定步骤,是应用运行过程中的关注点,关注点通常会横切多个对象,因此也被称为横切关注点。

程序执行点

JointPoint连接点是程序执行过程中明确的点,感觉这个说法比较抽象,我个人理解为一些入口点(如方法调用,异常处理),典型的为方法的调用,对类成员的访问以及异常处理程序块的执行。连接点是程序在运行过程中能够插入切面的点,比如方法调用、异常抛出、字段修改等。

注意:一个JointPoint自身可以嵌套其他JointPoint,就比如说,一个方法中又调用了另一个方法。

切入点

PointCut切入点是带有通知的连接点,在程序中主要体现为编写切入点表达式。切入点是对连接点进行拦截的定义。切入点用于定义通知应该切入到哪些连接点上,不同的通知需要切入到不同的连接点上,这种精准的匹配是由切入点的正则表达式来定义的。

切入点是可以插入增强处理的连接点,当某个连接点满足执行要求时,该连接点将被连接增强处理,该连接点也就变成了切入点。

切入点是拦截的方法,连接点JointPoint拦截后将变成切入点。

通知

Advice通知是AOP在特定切入点上执行的增强处理,是拦截到连接点之后要执行的代码,通知可以分为前置通知Before、后置通知AfterReturning、异常通知AfterThrowing、最终通知After、环绕通知Around五类。

  1. before advice, 在join point前被执行的 advice. 虽然before advice是在join point前被执行, 但是它并不能够阻止 join point 的执行, 除非发生了异常(即我们在 before advice 代码中, 不能人为地决定是否继续执行 join point 中的代码)

  2. after return advice, 在一个 join point 正常返回后执行的 advice`

  3. after throwing advice, 当一个 join point 抛出异常后执行的 advice

  4. after(final) advice, 无论一个join point是正常退出还是发生了异常, 都会被执行的 advice.

  5. around advice, 在 join point 前和 joint point 退出后都执行的 advice. 这个是最常用的 advice.

  6. introductionintroduction可以为原有的对象增加新的属性和方法。

织入

Weaving 织入通过切入点切入,将切面应用到目标对象并导致代理对象创建的过程。将切面应用到目标对象从而创建一个新的代理对象的过程,这个过程可以发生在编译器、类转载期、运行期,不同的发生点有着不同的前提条件。如果发生在编译器就需要有一个支持这种AOP实现的特殊编译器,发生在类转载期就需要有一个支持AOP实现的特殊类转载其,发生在运行期则可以直接通过反射机制与动态代理机制来动态实现。

代理对象

Proxy代理对象是AOP创建的对象,包含通知,代理是目标对象的加强。 代理是将通知应用到目标对象之后被动态创建的对象,可以简单理解代理对象的功能等同于目标对象的核心业务逻辑功能加上共有功能。代理对象对于使用者而言是透明的,是程序运行过程中的产物。

目标对象

Target目标对象是指代理的目标对象,是指要织入的对象模块。目标对象是那些即将切入切面的对象,也就是被通知的对象。这些对象中已经只剩下干干净净的核心业务逻辑代码,所有的共有功能等待AOP容器的切入。

目标对象是AOP进行增强处理的对象,也被称为增强的对象。如果AOP是通过运行时代理来实现的,那么这个对象将是一个被代理的对象。

AOP是典型的代理模式的体现,代理模式的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、将消息转发给委托类、事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象相关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象方法来提供特定的服务。

总结

在AOP中切面就是与业务逻辑独立,但又垂直存在于业务逻辑的代码结构中的通用功能组合;切面与业务逻辑相交的点就是切点;连接点就是把业务逻辑离散化后的关键节点;切点属于连接点,是连接点的子集;Advice(增强)就是切面在切点上要执行的功能增加的具体操作;在切点上可以把要完成增强操作的目标对象(Target)连接到切面里,这个连接的方式就叫织入

从代理机制到Spring AOP,这篇给你安排得明明白白的 - 简书 (jianshu.com)

AOP如何实现及实现原理_Java笔记-CSDN博客_aop原理

细说Spring——AOP详解(AOP概览)_啦啦啦的博客-CSDN博客_aop

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2019-2022 1nvisble
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信