《AOP 挖掘记》概念介绍及原理初探(一)

简介: ### AOP 的基本概念 AOP 是 Aspect-Oriented programming 的缩写,中文翻译为面向切面编程,它和 OOP 一样是一种编程思想。 AOP 把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处都基本相似。比如权限认证、日志、事务处理。AO

AOP 的基本概念

AOP 是 Aspect-Oriented programming 的缩写,中文翻译为面向切面编程,它和 OOP 一样是一种编程思想。

AOP 把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处都基本相似。比如权限认证、日志、事务处理。AOP 的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。通俗的讲就是将应用程序中的业务逻辑同对其提供支持的通用服务进行分离,AOP 可以说是 OOP 的补充和完善。
OOP 的基本特性.png

使用 OOP 的好处是可以设计出低耦合的系统,使系统更加灵活、更加易于维护,但同时也增加了代码的重复性。比如,我们要打印类中每个方法的出入参。按面向对象的编程思想,就必须在类的每方法中都加入日志打印功能。如下左图所示:

此时引入 AOP 的编程思想,将日志打印功能(切面),动态的切入到类中每个方法的前后(切点),无需改动原有代码,便可改变其原有的行为。如下右图所示:
OOP + AOP 日志例子.png

除此之外,使用 AOP 的编程思想,还能降低模块的耦合度、增强代码的复用性、使系统更容易扩展。

AOP 的相关术语

AOP 的相关术语.png

以上 AOP 术语在整个环节中的具体位置,如下图所示:
AOP 整个环节.png

AOP 的使用场景

AOP 的使用场景.png

AOP 的实现原理

在了解了 AOP 的基本特征、相关术语、使用场景之后,对设计模式有一定了解的朋友,一定已经猜到 AOP 实际上是基于代理模式实现的。

代理模式是常用的 Java 设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。如以下类图所示:
代理模式.png

按照代理的创建时期,代理类可以分为两种。

  • 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
  • 动态代理:在程序运行时,运用反射机制动态创建而成。

AOP 的具体实现

上面有讲过,切面织入的方式有3种,分别是:

  • 运行时织入(Runtime wearing):是指采用 JDK 动态代理或 CGLIB 工具进行切面的织入。
  • 编译期织入(Compile time wearing):是指在 Java 编译期,采用特殊的编译器,将切面织入到 Java 类中。
  • 类加载期织入(Classload time wearing):是指通过特殊的类加载器,在类字节码加载到 JVM 时织入切面。

我们最常用的 Spring AOP 是采用运行时织入(Runtime wearing),它是基于动态代理的实现的。如果需要代理的对象,实现了某个接口,那么 Spring AOP 会使用 JDK Proxy 去创建代理对象,而对于没有实现接口的对象,Spring AOP 会使用 CGLIB 生成一个被代理对象的子类,如下图所示:
Spring AOP.jpg

Spring AOP 的目的并不是为了提供最完整的 AOP 实现,而是为了要帮助解决企业应用中的常见问题,提供一个 AOP 实现与 Spring IOC 之间的紧密集成。如果你计划在 Spring Beans 之上将横切关注点模块化,那么 Spring AOP 是你的首选。但如果你用的是普通的 Java 对象而不是 Spring beans,又或者是想支持全部的 Pointcut 类型,那么你就需要引入更完备的 AOP 框架 AspectJ 了。

AspectJ 是一个面向切面的框架,它无缝扩展了 Java 语言,它有一个专门的编译器用来生成遵守 Java 字节编码规范的 Class 文件。它采用编译期织入(Compile time wearing)和类加载期织入(Classload time wearing),它是基于静态代理的实现的,是语言级的 AOP 实现,提供了完备的 AOP 支持。编译期织入过程如下图所示:
AspectJ AOP.png

除了 Spring AOP 和 AspectJ 之外,还有很多开源框架也包含了 AOP 的实现,大家只要明白了其实现原理,就可以举一反三,下次我会带着大家徒手实现简单的 AOP 框架,敬请期待。

系列文章

《AOP 挖掘记》徒手实现 AOP 框架(二)(未完成)
《AOP 挖掘记》Spring AOP 原理解析(三)(未完成)
《AOP 挖掘记》AspectJ AOP 原理解析(四)(未完成)

目录
相关文章
|
4月前
|
安全 Java Spring
Spring之Aop的底层原理
Spring之Aop的底层原理
|
4月前
|
设计模式 Java uml
Spring AOP 原理
Spring AOP 原理
28 0
|
1月前
|
Java
Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现
这篇文章是Spring5框架的实战教程,深入讲解了AOP的基本概念、如何利用动态代理实现AOP,特别是通过JDK动态代理机制在不修改源代码的情况下为业务逻辑添加新功能,降低代码耦合度,并通过具体代码示例演示了JDK动态代理的实现过程。
Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现
|
3月前
|
Java Maven 数据安全/隐私保护
详解 Java AOP:面向方面编程的核心概念与 Spring 实现
详解 Java AOP:面向方面编程的核心概念与 Spring 实现
62 1
|
29天前
|
监控 安全 数据库
面向方面编程(AOP)的概念
【8月更文挑战第22天】
43 0
|
3月前
|
XML Java 数据格式
Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))
Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))
34 0
|
3月前
|
设计模式 SQL Java
Spring框架第四章(AOP概念及相关术语)
Spring框架第四章(AOP概念及相关术语)
|
4月前
|
Java Spring
Spring中得Aop相关概念及运用
Spring中得Aop相关概念及运用
|
4月前
|
运维 Java 程序员
Spring5深入浅出篇:AOP底层实现原理
该文档介绍了Spring AOP的底层实现原理,核心问题包括动态代理类的创建。JDK动态代理通过`Proxy.newProxyInstance()`创建接口的实现类,而CGlib则是通过子类继承父类的方式生成代理对象。文中还提供了JDK和CGlib动态代理的代码示例。最后总结,JDK代理基于接口,CGlib则基于继承父类来实现。