AOP(面向切面编程,Aspect-Oriented Programming)是一种编程范式,旨在增加模块化的支持,通过分离横切关注点(cross-cutting concerns)来提高代码的可维护性。以下是AOP中的一些关键术语:
-
Aspect(切面):
- 切面是一个模块化的横切关注点,它可能会影响多个类。切面通常包括通知(Advice)和类型(Pointcut)的定义。
-
Join point(连接点):
- 程序执行过程中的某个点,例如一个方法的执行或一个异常的处理。在Spring AOP中,仅支持方法的连接点。
-
Pointcut(切点):
- 匹配连接点的断言。通知(Advice)与切点表达式关联,并在与切点匹配的连接点上运行。
-
Advice(通知):
- 在切点的特定连接点处执行的动作。这是切面对程序行为的核心扩展。通知有几种类型,包括:
- Before(前置通知): 在连接点之前执行的通知。
- After(后置通知): 在连接点正常完成后执行的通知。
- After returning(返回后通知): 在连接点返回一个结果后执行的通知。
- After throwing(抛出后通知): 在连接点抛出异常后执行的通知。
- Around(环绕通知): 在连接点之前和之后都可以执行的通知,并有能力决定是否执行连接点。
- 在切点的特定连接点处执行的动作。这是切面对程序行为的核心扩展。通知有几种类型,包括:
-
Introduction(引入):
- 为现有的对象类型声明额外的方法或字段。Spring AOP允许你向任何通知对象引入新的接口(及其实现)。
-
Target object(目标对象):
- 由一个或多个切面通知的对象。也被称为“被通知对象”。
-
AOP proxy(AOP代理):
- 由AOP框架创建的对象,用于实现切面契约(包括通知等功能)。在Spring中,AOP代理可以是JDK动态代理或CGLIB代理。
-
Weaving(织入):
- 将切面与其他应用程序类型或对象链接起来,以创建一个被通知的对象。这可以在编译时、类加载时或运行时完成。Spring AOP和其他纯Java AOP框架通常在运行时执行织入。
以上这些都是AI出来的,接下来谈谈我自己的理解:首先我们知道OOP(面向对象编程)不能处理一些分散在多个类或对象中的公共行为(如日志记录,事务管理,权限控制,接口限流等),这些通常被称为横切关注点。如果我们在每个类中都重复这些代码,胡造成代码的冗余,复杂和难以维护。所以AOP解决了这一问题,AOP可以将横切关注点分从核心逻辑(核心关注点)中分离出来,实现关注点的分离。
这里讲一个例子,在学校中,我们要住在宿舍,但是宿舍的核心业务是睡觉,但是也可以学习,所以将学习的地方抽象出来成教学楼图书馆,集中到一个地方管理,睡觉我就管理睡觉,学习我就管理学习,分开管理便于维护,而这个“学习的地方”就可以称之为横切关注点,将它从宿舍中分离出来实现了横切关注点的分离。
我在学习AOP时,觉得它的思想和封装非常相似。在AOP中,切面的实现细节被隐藏,业务逻辑只要引用即可,封装也是隐藏对象的内部属性和实现方法,只暴露出接口与外界进行交互,这种分离效果二者极其相似。但封装专注于对象的内部,而AOP关注与多个对象和跨对象。