springAOP的基础术语,带图

本文详细介绍了面向切面编程(AOP)的概念及其在软件开发中的应用。通过类比抄表员的工作流程,解释了AOP中的核心概念,如通知、连接点、切点、切面、引入和织入等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

面向切面编程( aspect-oriented programming , AOP )允许你把遍布应用各处的功能分离出来
形成可重用的组件。
面向切面

一:aop是什么?

aop是oop思想的延续,oop是面向对象的思想过程,是对面向过程的思想进行的抽象和封装,而aop是对oop思想的进一步优化和总结,它将多种业务逻辑中的公用部分进行抽取(比如日志记录,性能统计,安全验证等),从而达到代码的复用;

二:理解aop中的术语

1.通知(Advice)

当抄表员出现在我们家门口时,他们要登记用电量并回去向电力公司报告。显然,他们必须有一份需要抄表的住户清单,他们所汇报的信息也
很重要,但记录用电量才是抄表员的主要工作。
类似地,切面也有目标 —— 它必须要完成的工作。在 AOP 术语中,切面的工作被称为通知。
通知定义了切面是什么以及何时使用。除了描述切面要完成的工作,通知还解决了何时执行这个工作的问题。
Spring 切面可以应用 5 种类型的通知:

  • 前置通知( Before ):在目标方法被调用之前调用通知功能;
  • 后置通知( After ):在目标方法完成之后调用通知,此时不会关心方法的输出是什么;
  • 返回通知( After-returning ):在目标方法成功执行之后调用通知;
  • 异常通知( After-throwing ):在目标方法抛出异常后调用通知;
  • 环绕通知( Around ):通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。
2.连接点( Join point )

电力公司为多个住户提供服务,甚至可能是整个城市。每家都有一个电表,这些电表上的数字都需要读取,因此每家都是抄表员的潜在目标。抄表员也许能够读取各种类型的设备,但是为了完成他的工作,他的目标应该房屋内所安装的电表。

同样,我们的应用可能也有数以千计的时机应用通知。这些时机被称为连接点。连接点是在应用执行过程中能够插入切面的一个点。这个点可以是调用方法时、抛出异常时、甚至修改一个字段时。切面代码可以利用这些点插入到应用的正常流程之中,并添加新的行为.

3.切点( Poincut )

如果让一位抄表员访问电力公司所服务的所有住户,那肯定是不现实的。实际上,电力公司为每一个抄表员都分别指定某一块区域的住户。类似地,一个切面并不需要通知应用的所有连接点。切点有助于缩小切面所通知的连接点的范围。
如果说通知定义了切面的 “ 什么 ” 和 “ 何时 ” 的话,那么切点就定义了 “ 何处 ” 。切点的定义会匹配通知所要织入的一个或多个连接点。我们通常使用
明确的类和方法名称,或是利用正则表达式定义所匹配的类和方法名称来指定这些切点。有些 AOP 框架允许我们创建动态的切点,可以根据运行时的决策(比如方法的参数值)来决定是否应用通知。

4.切面( Aspect )

当抄表员开始一天的工作时,他知道自己要做的事情(报告用电量)和从哪些房屋收集信息。因此,他知道要完成工作所需要的一切东西。
切面是通知和切点的结合。 通知和切点共同定义了切面的全部内容 —— 它是什么,在何时和何处完成其功能。

5.引入( Introduction )

引入允许我们向现有的类添加新方法或属性。例如,我们可以创建一个 Auditable 通知类,该类记录了对象最后一次修改时的状态。这很简单,只需一个方法, setLastModified(Date) ,和一个实例变量来保存这个状态。然后,这个新方法和实例变量就可以被引入到现有的类中,从而可以在无需修改这些现有的类的情况下,让它们具有新的行为和状态。

6.织入( Weaving )

织入是把切面应用到目标对象并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。在目标对象的生命周期里有多个点可以进行织入:

  • 编译期:切面在目标类编译时被织入。这种方式需要特殊的编译器。 AspectJ 的织入编译器就是以这种方式织入切面的。
  • 类加载期:切面在目标类加载到 JVM 时被织入。这种方式需要特殊的类加载器( ClassLoader),它可以在目标类被引入应用之前增强该目标类的字节码。 AspectJ 5 的加载时织入( load-time weaving , LTW )就支持以这种方式织入切面。
  • 运行期:切面在应用运行的某个时刻被织入。一般情况下,在织入切面时, AOP 容器会为目标对象动态地创建一个代理对象。 SpringAOP就是以这种方式织入切面的。
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值