【老王读Spring AOP-0】SpringAop引入&&AOP概念、术语介绍

前言

AOP(面向切面编程)通过提供另一种思考程序结构的方式来补充 OOP(面向对象编程)。OOP 中模块化的关键单元是类,而 AOP 中模块化的单元是切面(aspect)。切面支持关注点的模块化,例如跨多个类型和对象的事务管理。(在AOP文献中,此类关注点通常被称为横切关注点。)

AOP 框架是 Spring 的关键组件之一。
SpringIoC 容器不依赖于 AOP,这意味着如果您不想使用 AOP,就不需要使用AOP。但 AOP 补充了 SpringIoC,使得 Spring 提供了一个功能非常强大的中间件解决方案。

https://docs.spring.io/spring-framework/docs/5.3.9/reference/html/core.html#aop
https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#aop

版本约定

Spring 5.3.9 (通过 SpringBoot 2.5.3 间接引入的依赖)

正文

Spring AOP 和 AspectJ 的关系

Spring AOP 和 AspectJ 都是面向切面编程的框架,Spring AOP 框架借用了 AspectJ 风格的切入点语法来方便的定义切面。

Spring AOP

Spring AOP 是 Spring 提供的一个面向切面编程的框架,它支持两种方式来自定义切面:

  1. schema-based 的方式
  2. @AspectJ 注解的方式

这两种风格都提供了全类型的 Advice 和 AspectJ 切入点语言的使用,不管使用哪种方式,最终都是使用 Spring AOP 框架进行织入的。
Spring AOP 框架借用了 AspectJ 风格的切入点语法来方便的定义切面。
schema-based 的方式定义切面时,除了使用 AspectJ 风格的切入点语法,还可以使用基于正则表达式的切入点语法,这种方式用的很少。

AspectJ

AspectJ 是一个易用的功能强大的 AOP 框架,它的全称是 Eclipse AspectJ。

了解更多请戳官网地址:http://www.eclipse.org/aspectj/

AOP 中的概念和术语

AOP 中的概念和术语并不是 Spring 特有的,而是 AOP 联盟共同定义的。

  • Aspect: “切面”,表示横跨多个类的模块化关注点。
    事务管理是企业级 Java 应用程序中横切关注点的一个很好的例子。
    在 Spring AOP 中,Aspect 是通过 schema-based 或 @Aspect 注解来实现的。

  • Join point: “连接点”,表示程序执行过程中的一个点,如方法的执行或异常的处理。
    在 Spring AOP 中,Join point 始终表示方法执行,对应到目标对象中的具体的方法。

  • Advice: “通知”,表示 Aspect 在特定的 Join point 采取的操作。包括 “around”, “before” and “after 等

  • Pointcut: “切点”,它是匹配连接点的谓词。可以说"Pointcut"表示的是"Join point"的集合。
    通过切点表达式来匹配 Join point,Spring 默认使用 AspectJ 切入点表达式语言。
    切点表达式匹配连接点的概念是 AOP 的核心。
    Advice 与 Pointcut 关联之后,将在与切点表达式(Pointcut expression)匹配的任意连接点上运行。

  • Introduction: 代替一个类型声明附加的方法或字段。
    Spring AOP 允许您向任何 Advice 的对象引入新接口(以及相应的实现)。例如,您可以使用 Introduction 使 bean 实现 IsModified 接口。(Introduction 在 AspectJ 社区中称为类型间声明。inter-type declaration)

  • Target object: 被代理的原始对象

  • Weaving: “织入”。把代理逻辑加入到目标对象上的过程叫织入。
    Weaving 可以在编译时(例如使用AspectJ编译器)、加载时或运行时完成。Spring AOP 和其他纯 Java AOP 框架一样,在运行时执行织入。

Spring AOP 的目标和提供的能力

Spring AOP 是用纯 Java 实现的,不需要特殊的编译过程,适合在 servlet 容器 或 单纯的应用服务器中使用。

Spring AOP 提供的能力

Spring AOP 目前只支持方法执行连接点(method execution join points),即只支持对 Spring Bean 上执行方法进行 通知(Advising)。
虽然可以在不破坏 Spring AOP 核心 API 的情况下添加对 filed 拦截的支持,但 Spring AOP 并未进行实现。
如果需要 Advise 字段访问 和 字段更新的 join point,请考虑诸如 AspectJ 之类的语言。

Spring AOP 的目标

Spring AOP 不同于大多数其他 AOP 框架,其目的不是提供最完整的 AOP 实现。Spring AOP 的目的是提供与 Spring IoC 之间的紧密集成的 AOP 实现,以帮助解决企业应用程序中的常见问题。
所以,Spring AOP 通常都是与 Spring IoC 一起使用。

Spring AOP 与 AspectJ 不是竞争的关系,而是互补的关系。Spring 的目标不是提供全面的 AOP 解决方案。
Spring 将 Spring AOP、Spring IoC 和 AspectJ 无缝集成,以便在一致的基于 Spring 的应用程序体系结构中使用 AOP。

如何去研究 Spring AOP?

Spring AOP 要解决的是横切关注点的问题,从技术角度来看,首先要找到与横切关注点(即 join point)匹配的 Advisor,然后再执行 Advice。
所以,我们思考一下,要实现 Spring AOP 大体会分如下几步:

  1. 找到与 bean 匹配的所有的 Advisor
  2. 使用所有匹配的 Advisor 来为 bean 生成生成动态代理
  3. 通过动态代理类执行 Advice
  4. 将 Spring AOP 与 Spring IoC 进行结合

我们可以通过上面的步骤来一个个问题进行研究,各个击破!

小结

Spring AOP 是 Spring 提供的一个面向切面编程的框架,它支持两种方式来自定义切面:

  1. schema-based 的方式
  2. @AspectJ 注解的方式

Spring AOP 与 AspectJ 不是竞争的关系,而是互补的关系。Spring 的目标不是提供全面的 AOP 解决方案。

实现 Spring AOP 大体会分如下几步:

  1. 找到与 bean 匹配的所有的 Advisor
  2. 使用所有匹配的 Advisor 来为 bean 生成生成动态代理
  3. 通过动态代理类执行 Advice
  4. 将 Spring AOP 与 Spring IoC 进行结合

如果本文对你有所帮助,欢迎点赞收藏!

源码测试工程下载:
老王读Spring IoC源码分析&测试代码下载
老王读Spring AOP源码分析&测试代码下载

公众号后台回复:下载IoC 或者 下载AOP 可以免费下载源码测试工程…

阅读更多文章,请关注公众号: 老王学源码
gzh


系列博文:
【老王读Spring AOP-0】SpringAop引入&&AOP概念、术语介绍
【老王读Spring AOP-1】Pointcut如何匹配到 join point
【老王读Spring AOP-2】如何为 Pointcut 匹配的类生成动态代理类
【老王读Spring AOP-3】Spring AOP 执行 Pointcut 对应的 Advice 的过程
【老王读Spring AOP-4】Spring AOP 与Spring IoC 结合的过程 && ProxyFactory 解析
【老王读Spring AOP-5】@Transactional产生AOP代理的原理
【老王读Spring AOP-6】@Async产生AOP代理的原理
【Spring 源码阅读】Spring IoC、AOP 原理小总结

相关阅读:
【Spring源码三千问】Spring动态代理:什么时候使用的 cglib,什么时候使用的是 jdk proxy?
【Spring源码三千问】Advice、Advisor、Advised都是什么接口?
【Spring源码三千问】没有AspectJ,Spring中如何使用SpringAOP、@Transactional?
【Spring源码三千问】Spring AOP 中 AbstractAdvisorAutoProxyCreator、AbstractAdvisingBeanPostProcessor的区别
【Spring 源码三千问】同样是AOP代理bean,为什么@Async标记的bean循环依赖时会报错?

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老王学源码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值