0301概述-AOP-spring6

1 面向切面编程思想

面向切面编程思想(Aspect-Oriented Programming,AOP)是一种软件开发技术,它的核心思想是将不同模块或组件共同的关注点进行抽象,并以独立的方式进行处理。这些关注点通常涉及横跨多个对象和系统层次结构的功能,如安全、事务、日志、缓存等。

  • 核心业务和交叉业务

在软件系统开发中,核心业务是指与系统主要功能直接相关的业务模块,通常是系统的主要价值所在,也是系统的核心竞争力。核心业务一般由开发团队或者产品经理直接负责,开发团队通常会对核心业务进行更加严格的测试和代码质量控制,以确保系统的稳定性和可靠性。

交叉业务则是指与核心业务无直接关系,但在系统开发中也是必不可少的业务模块,如安全、日志、事务、缓存、权限控制等。交叉业务通常被称为“横切关注点”,因为它们横跨多个业务模块,对系统的整体功能进行支持和增强。

在系统开发中,核心业务和交叉业务通常是分开开发和维护的,这样可以保证系统的灵活性和可扩展性。核心业务的开发团队专注于实现系统的主要功能,而交叉业务的开发团队则专注于实现系统的横切关注点,以提高系统的性能、安全性和可靠性。

AOP技术就是为了更好地处理交叉业务而产生的,它将交叉业务与核心业务分离开来,通过定义切点和通知来实现横切关注点的功能。AOP技术可以将交叉业务与核心业务进行解耦,从而提高系统的可维护性和可扩展性。

0301概述-AOP-spring6_第1张图片

AOP的核心思想是将横切关注点(cross-cutting concerns)从主业务逻辑中分离出来,从而提高代码的可维护性和可扩展性。AOP通过定义切点(Pointcut)和通知(Advice)来实现横切关注点的功能。切点定义了哪些方法或类需要被横切,而通知定义了在切点处执行的行为。通知可以在方法执行之前、之后或者异常抛出时执行。

  • 实现

AOP技术可以通过代理模式、字节码增强、装饰者模式等方式实现。例如,Spring框架中的AOP模块就是通过动态代理实现的。而AspectJ则是一种基于字节码增强的AOP技术。

  • 优势

AOP技术的优点在于能够降低系统中的重复代码,将代码的业务逻辑与横切关注点分离,提高代码的可重用性、可维护性和可扩展性。同时,AOP也能提供更好的代码可读性和模块化程度。

总之,面向切面编程思想是一种非常实用的软件开发技术,通过将共同的关注点进行抽象,使得系统更加灵活、易于维护和扩展。

2 术语

以下是面向切面编程(AOP)中常用的一些术语:

  1. 连接点(Join Point):在应用执行过程中可以织入切面的点,通常是方法的调用或异常的抛出等。

    • 连接点描述的是位置,图示2-1所示:0301概述-AOP-spring6_第2张图片
  2. 切点(Pointcut):在程序执行流程中,真正织入切面的方法;

    • 切点本质上就是方法
  3. 通知(Advice):定义了切面在切点处执行的行为,如在方法执行前、执行后、抛出异常时等执行的操作。

    • 通知又叫增强,就是具体要织入的代码。通知包括:
      1. 前置通知(Before Advice):在切点方法执行前执行的通知。
      2. 后置通知(After Advice):在切点方法执行后执行的通知,无论是否抛出异常都会执行。
      3. 环绕通知(Around Advice):可以控制切点方法的执行,包含了前置、后置和返回通知等所有通知类型的功能,可以对方法的执行过程进行完全控制。
      4. 异常通知(After Throwing Advice):在切点方法抛出异常后执行的通知,可以访问到抛出的异常。
      5. 返回通知(After Returning Advice):在切点方法正常返回后执行的通知,可以访问到方法的返回值。
  4. 切面(Aspect):横跨多个模块的关注点被称为切面,如安全、事务、日志、缓存等。

    • 简单理解切点+通知=切面
  5. 织入(Weaving):将切面应用到目标对象并创建新的代理对象的过程。

  6. 目标对象(Target Object):被代理的对象,切面将被织入到目标对象的方法调用中。

  7. AOP代理(AOP Proxy):将切面织入到目标对象中的代理对象,可以通过JDK动态代理或CGLIB字节码增强等技术来实现。

  8. 切面优先级(Aspect Precedence):如果多个切面应用于同一连接点,则切面优先级定义了切面的执行顺序。

  9. 引入(Introduction):在不修改类定义的情况下向现有对象添加新方法或属性的方式,也可以被视为切面的一种。

如下图2-2所示,可以帮助大家更好的理解AOP相关术语:

0301概述-AOP-spring6_第3张图片

3 切点表达式

切点表达式(Pointcut Expression)是一种用于定义切点的表达式语言,它可以指定在哪些方法上应用通知。切点表达式基于一些通配符和逻辑运算符,可以选择要拦截的方法和类。切点表达式的格式如下:

execution(<execution-modifier>? return-type <class-name>.method-name(parameter-list) <throws-clause>?)

其中,尖括号内的是可选项,问号表示该项可以出现零次或一次,具体说明如下:

  1. execution-modifier:

    • 可选项

    • 表示方法执行的修饰符,例如public、private、protected等。

  2. return-type:表示方法的返回类型,例如void、int、String等,也可以使用通配符*来表示任意类型。

  3. class-name:表示方法所属的全限定类名,…两个点代表当前包以及子包下的所有类。

  4. method-name:表示方法名,可以使用通配符*来匹配任意方法名。

  5. parameter-list:

    • 必填项

    • 表示方法的参数列表,可以指定参数类型,也可以使用…来匹配任意的参数类型。

    • ()没有参数;(…)任意个数任意类型的参数;(*)任意一个参数。

  6. throws-clause:表示方法抛出的异常类型,可以省略。

例如,以下是一个切点表达式的示例,它匹配了所有public方法:

execution(*  com.gaogzhen..*(..))

这个表达式中的execution表示方法执行,* 表示匹配任意修饰的方法,com.gaogzhen…表示匹配com.gaogzhen包及其子包下的所有类,*匹配任意方法名,…表示匹配任意参数。

结语

如果小伙伴什么问题或者指教,欢迎交流。

❓QQ:806797785

⭐️源代码仓库地址:https://gitee.com/gaogzhen/spring6-study

参考:

[1]Spring框架视频教程[CP/OL].P103-105.

[2]ChatGPT

你可能感兴趣的:(#,spring全家桶,面向切面编程,AOP,spring,Java)