《AOP 挖掘记》概念介绍及原理初探(一)-阿里云开发者社区

开发者社区> stone哥> 正文

《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 原理解析(四)(未完成)

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Swift 可选值(Optional Values)介绍
Optional的定义 Optional也是Objective-C没有的数据类型,是苹果引入到Swift语言中的全新类型,它的特点就和它的名字一样:可以有值,也可以没有值,当它没有值时,就是nil。
817 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
3965 0
Spring AOP 使用介绍,从前世到今生
原文出处:https://javadoop.com/post/spring-aop-intro 前面写过 Spring IOC 的源码分析,很多读者希望可以出一个 Spring AOP 的源码分析,不过 Spring AOP 的源码还是比较多的,写出来不免篇幅会大些。
969 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
7612 0
GraphScope 图分析引擎 - GRAPE 介绍
GraphScope 中的图分析引擎继承自 GRAPE,该系统实现了论文 Parallelizing Sequential Graph Computations 中提出的不动点计算模型
173 0
OpenStack Icehouse neutron-networking 架构介绍
采用了OpenStack中新的网络管理组件(neutron),具体参见安装指导。上图为该网络部署结构的示意,分为三类节点: 控制节点 负责整个OpenStack机群的管控,由于它不承担kvm虚拟机的实际运行,负载交轻,一般将管理性(仅仅负责调度,监控)的服务...
971 0
Ubuntu 18.04 网络配置介绍
从Ubuntu 18.04.2版本开始,系统的网络配置改成了新的 netplan.io 方式,弃用了之前使用的 ifupdown 方式。所以网络配置文件和配置方式和之前不同,本文主要介绍新的配置方式如何使用及与之前的区别。
4720 0
+关注
1
文章
14
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载