AOP

AOP

AOP(Aspect Oriented Programming,面向切面编程)通过提供一种思考程序结构的方式来补充OOP(Object Oriented Programming,面向对象编程)。OOP模块化的关键单元是类,而在AOP中,模块化的单元是切面。切面可以实现跨多个类型和对像之间的事务管理、日志等方面的模块化。

Spring框架中使用AOP主要有以下优势:

  • 提供声明式企业服务,特别是作为 EJB声明式服务的替代品。重要的是,这种服务是声明式事务管理。
  • 允许用户实现自定义切面。在某些不适合用OOP编程的场景中,采用AOP来补充。
  • 可以对业务逻辑的各个部分进行隔离,从而使业务逻辑各部分之间的耦合度降低,提高程序的可用性,同时提高开发效率。

要使用Spring AOP 需要添加spring-aop 模块。

AOP核心概念

image-20220402110359545

  • Aspect(切面):将关注点进行模块化。在Spring AOP中,切面可以使用常规类(基于模式的方法)或@Aspect注解的常规类来实现。
  • Join Point(连接点):在程序执行过程中的某个特定的点。如某方法调用时或处理异常时。在Spring AOP中,一个连接点总是代表一个方法的执行。
  • Advice(通知):在七日面的某个特定的连接点上执行的动作。通知有各种类型,包括around、before和after等。许多AOP框架都是以拦截器来实现通知模型,并维护一个以连接点为中心的拦截器链。
  • Pointcut(切入点):匹配连接点的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(如当执行某个特定的方法时)。切入点表达式如何和连接点匹配是AOP的核心。Spring默认使用AspectJ切入点语法。
  • Introduction(引入):声明额外的方法或某个类型的字段。Spring允许引入新的接口(及一个对应的实现)到任何被通知的对象。例如,可以使用一个引入来使bean实现IsModified接口,以便简化缓存机制。
  • Target Object(目标对象):被一个或多个切面通知的对象。也有人把它称为Adviced(被通知)对象。既然Spring AOP是通过运行时代理实现的,那么这个对象永远是一个Proxied(被代理)对象。
  • AOP Proxy(AOP代理):AOP框架创建的对象用来实现Aspect Contract(切面契约),包括通知方法执行等功能。在Spring中,AOP代理可以JDK动态代理或CGLIB代理。
  • Weaving(织入):把切面连接到其他的应用程序类型或对象上,并创建一个Adviced (被通知)的对象。这些可以在编译时(如使用AspectJ编译器)、类加载时和运行完成时。

Advice(通知)类型

  • Before Advice(前置通知):在某连接点之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)。
  • After Returning Advice(返回后通知):在某连接点正常完成后执行的通知,如果一个方法没有抛出异常,就正常返回。
  • After Throwing Advice(抛出异常后通知):在方法抛出异常退出时执行的通知。
  • After (finally) Advice(最后通知):当某连接点退出时执行的通知(不论是正常返回还是异常退出)。
  • Around Advice(环绕通知):包围一个连接点的通知。如方法调用。这是很强大的一种通知类型。环绕通知可以在方法调用前后完成自定义的行为,它也会选择是否继续执行连接点,或者直接返回它自己的返回值或抛出异常来结束执行。Around Advice是常用的一种通知类型。与AspectJ一样,Spring提供所有的类型的通知,推荐使用尽量简单的通知类型来实现需要的功能。例如,如果只是需要用一个方法的返回值来更新缓存,虽然使用环绕通知也能完成同样的事情,但最好使用After Returning通知,而不是使用环绕通知。用合适的通知类型可以使编程模型变得简单,并且能够避免很多潜在的错误。

AOP代理

Spring AOP默认使用标准的JDK动态代理,这样任何接口(或接口的set方法)都可以被代理。

Spring AOP也支持CGLIB代理,当需要代理类(而不是代理接口)时,CGLIB代理是很有必要的。如果一个业务对象并没有实现一个接口,就会默认使用CGLIB、


AOP
http://example.com/2022/09/04/AOP/
作者
liziyuan
发布于
2022年9月4日
许可协议