第一节 AOP简介

亮子 2023-06-07 06:35:36 17213 0 0 0

1、什么是AOP?

AOP就是面向切面编程,或者叫面向方面编程,或者开玩笑的说叫面向方便面编程。

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

用我的话讲,比如一个方法,他只能计算加法,而不能计算乘法,但是又不想改源码!这时候可以在外面创建一个类,在这个类中通过AOP的技术给这个方法进行添加功能的操作,这就是AOP。

2、AOP的作用是什么?

AOP(Aspect-Oriented Programming)是一种编程范式,它可以通过使用切面来分离横切关注点(cross-cutting concerns)并对它们进行统一的处理。AOP将代码中的业务逻辑和非业务逻辑分离,使得代码更加清晰、易于维护和扩展。

AOP的主要作用如下:

  • 非功能性需求处理:AOP可用于处理与业务逻辑无关的需求,例如日志记录、安全性检查、事务处理、性能监控等。通过将这些需求抽象为横切关注点,可以在整个应用程序中统一实现。

  • 代码重用:AOP可用于将横切关注点模块化,并在多个应用程序中复用。例如,可以编写一个日志切面,并将其应用于多个模块或应用程序中,从而减少了代码冗余,并提高了代码重用率。

  • 代码解藕:AOP可以通过将横切关注点与业务代码分离来减少类之间的耦合度。这样,业务逻辑代码不需要考虑非业务逻辑的实现方式,也就不会受到非业务逻辑的影响。

  • 代码优化:AOP可用于在不改变业务逻辑的情况下对代码进行优化,例如缓存、事务等。通过将这些操作抽象为切面,并在合适的时机进行拦截和处理,可以使得应用程序更加高效。

总之,AOP是一种非常有用的编程范式,它可以有效地解决代码中的横切关注点问题,并提高代码的可维护性、可扩展性和可重用性。

3、AOP的底层原理是什么?

AOP的底层原理是利用代理模式来实现。在应用程序中,被代理对象和代理对象都实现了同样的接口或者继承了同样的父类,因此客户端无法区分它们的不同,代理对象可以通过代理方法拦截客户端请求,并在必要时调用被代理对象的方法。

在AOP中,切入点是指需要进行横切处理的目标方法或类,通知(Advice)是指切面需要执行的代码片段,切面(Aspect)是指由切点和通知组成的横切关注点。

当一个应用程序中有多个切面时,AOP框架会将这些切面织入到目标对象中,形成代理对象。对于每个切点,AOP框架都会生成一个拦截器(Interceptor),在目标方法调用前后执行拦截器中的逻辑,从而实现横切关注点的处理。

AOP的实现方式有两种:静态代理和动态代理。静态代理需要手动编写代理类,并在代码中显式地调用代理方法,需要对每个目标对象编写一个代理类;而动态代理则是在运行时动态地生成代理类,所以不需要为每个目标对象编写一个代理类。Java JDK提供了两种动态代理方式:基于接口的代理(JDK动态代理)和基于类的代理(CGLIB动态代理)。

总之,AOP利用代理模式实现了切面的功能,其中拦截器是AOP框架中最核心的组件,它负责拦截目标对象的方法调用,并在必要时执行通知中定义的逻辑。不同的AOP实现方式可能有不同的实现方法,但其本质都是利用代理模式来实现横切关注点的处理。

第一种:有接口情况,使用JDK动态代理;创建接口实现类代理对象,增强类的方法

图片alt

第二种:没有接口情况,使用CGLIB动态代理;创建子类的代理对象,增强类的方法

图片alt

4、AOP的一些常用术语

  • 横切关注点:跨越应用程序多个模块的方法或功能。即是,与我们业务逻辑无关的,但是我们需要关注的部分,就是横切关注点。如日志 , 安全 , 缓存 , 事务等等 …
  • 切面(ASPECT):横切关注点 被模块化 的特殊对象。即,它是一个类。
  • 通知(Advice):切面必须要完成的工作。即,它是类中的一个方法。
  • 目标(Target):被通知对象。
  • 代理(Proxy):向目标对象应用通知之后创建的对象。
  • 切入点(PointCut):切面通知 执行的 “地点”的定义。
  • 连接点(JointPoint):与切入点匹配的执行点。

5、AOP的通知类型

  • 前置通知(@Before):在某连接点(join point)之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)

  • 返回后通知(@AfterReturning):在某连接点(join point)正常完成后执行的通知:例如,一个方法没有抛出任何异常,正常返回

  • 抛出异常后通知(@AfterThrowing):方法抛出异常退出时执行的通知

  • 后置通知(@After):当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)

  • 环绕通知(@Around):包围一个连接点(join point)的通知,如方法调用。这是最强大的一种通知类型,环绕通知可以在方法调用前后完成自定义的行为,它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行

参考文章