什么是AOP

AOP(Aspect Oriented Programming,面向切面编程),通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。

AOP的作用

利用AOP编程可以对业务逻辑的各个部分进行隔离,从而使业务逻辑各部分之间的耦合度降低(低耦合),提高程序的可重用性,提高开发效率。

AOP的功能

  • 日志记录
  • 性能统计
  • 安全控制
  • 事务处理
  • 异常处理
  • 其他功能

AOP专业术语

  • 横切关注点:在软件开发中,分布于应用中多处的功能被称为横切关注点。通常,这些横切关注点从概念上是与应用的业务逻辑分离的(但往往直接嵌入到应用的业务逻辑之中),AOP的目标正是将这些横切关注点与业务逻辑隔离开来。
  • 连接点(Joinpoint):程序执行的某个特定位置〈如类开始初始化前、类初始化后。类某个方法调用前、调用后、方法跑吹异常后)。一个类或一段程序代码拥有一些具有边界性质的特定点,这些代码中的特定点就称为连接点(即插入代码的位置)。

注意: Spring AoP仅支持方法的连接点,即仅能在方法调用前、方法调用后、方法抛出异常时以及方法调用前后这些程序执行点织入增强。

  • 切点(Pointcut):每个类一般都拥有多个连接点(一般一个方法就是一个连接点)。AOP需要定位到特定的连接点,而定位连接点的方式称为切点。连接点相当于数据库中的记录,而切点相当于查询条件,一个切点可以匹配多个连接点。(即插入代码位置的查询条件)。

注意:Spring AOP中切点通过Pointcut接口定义,它使用类和方法作为连接点的查询条件。SpringAOP的规则解析引擎负责解析切点所设定的查询条件,找到对应的连接点。

  • 增强(Advice):增强是织入到目标类连接点上的一段程序代码。在Spring AOP中,增强除用于描述一段程序代码外还拥有另一个和连接点相关的信息-执行点的方位。结合执行点的方位信息和切点信息,AOP就可以找到特定的连接点。因为增强既包括了用于添加到目标连接点上的一段执行逻辑,由包含用于定位连接点的方位信息,所以Spring所提供的增强接口都带有方位名(即插入的代码块)。
  • 引介(lntroduction):引介是一种特殊的增强,它为类添加一些属性和方法。即使一个业务类原本没有实现某个接口,也可以通过AOP引介功能,动态地位该业务类添加接口的实现逻辑,让业务类成为这个接口的实现类。
  • 目标对象(Target):它是增强逻辑的织入目标类。通过AOP,业务逻辑类只需要实现非横切逻辑的代码,而性能监视、事务管理等横切逻辑则可以使用AOP动态织入到特定的连接点上。
  • 织入(Weaving):织入是将增强添加对目标类具体连接点上的过程。
  • 切面(Aspect):切面由切点和增强或引介组成。它既包括了横切逻辑的定义,也包括了连接点的定义。
  • 切面=切点+增强((或引介)

注意:Spring AOP负责实施切面的框架,它将切面所定义的横切逻辑织入到切面所指定的连接点中。

AOP织入的的三种方式

  • 编译器织入:要求使用特殊的编译器;
  • 类装载器织入:要求使用特殊的类装载器;
  • 动态代理织入:在运行期为目标类添加增强生成子类的方式。

注意:Spring AOP采用动态代理织入方式。

AOP的优点

  • AOP将横切关注点从主业务逻辑中分离出来,使得代码更加模块化和可维护。通过将横切关注点封装为独立的切面,可以将其在不同的应用程序模块中进行重复使用,避免了代码的重复编写。

  • AOP提供了一种机制,使得横切关注点可以在应用程序的不同部分中进行重用。这样可以减少代码的冗余,提高代码的可重用性,并且在需要修改横切关注点时,只需要修改切面,而无需修改主业务逻辑。

  • AOP通过将横切关注点分离出来,实现了主业务逻辑与横切关注点的解耦。主业务逻辑只需关注核心功能的实现,而不需要关注横切关注点的具体处理逻辑。这样可以提高代码的可维护性,并且方便对横切关注点进行修改和扩展。

  • AOP可以使代码更加简洁和清晰。通过将横切关注点从主业务逻辑中提取出来,主业务逻辑的代码变得更加简单明了,不再混杂着各种横切关注点的处理逻辑。

  • AOP将横切关注点封装为独立的切面,便于管理和维护。当需要修改或调整横切关注点时,只需修改切面的代码,而不需要修改主业务逻辑。这样可以减少错误发生的概率,并且方便对横切关注点进行跟踪和调试。

AOP(面向切面编程)的更多相关文章

  1. AOP 面向切面编程, Attribute在项目中的应用

    一.AOP(面向切面编程)简介 在我们平时的开发中,我们一般都是面对对象编程,面向对象的特点是继承.多态和封装,我们的业务逻辑代码主要是写在这一个个的类中,但我们在实现业务的同时,难免也到多个重复的操 ...

  2. AOP面向切面编程的四种实现

     一.AOP(面向切面编程)的四种实现分别为最原始的经典AOP.代理工厂bean(ProxyFacteryBean)和默认自动代理DefaultAdvisorAutoProxyCreator以及Bea ...

  3. Javascript aop(面向切面编程)之around(环绕)

    Aop又叫面向切面编程,其中“通知”是切面的具体实现,分为before(前置通知).after(后置通知).around(环绕通知),用过spring的同学肯定对它非常熟悉,而在js中,AOP是一个被 ...

  4. Method Swizzling和AOP(面向切面编程)实践

    Method Swizzling和AOP(面向切面编程)实践 参考: http://www.cocoachina.com/ios/20150120/10959.html 上一篇介绍了 Objectiv ...

  5. [转] AOP面向切面编程

    AOP面向切面编程 AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术. ...

  6. C# AOP 面向切面编程之 调用拦截

    有时候我们需要在代码中对方法调用进行拦截,并修改参数和返回值,这种操作叫做AOP(面向切面编程) 不过需要注意的是,AOP的效率很慢,在需要高效率场合慎用. 以下是C#的AOP方法: 首先建立一个控制 ...

  7. 【原创】Android AOP面向切面编程AspectJ

    一.背景: 在项目开发中,对 App 客户端重构后,发现用于统计用户行为的友盟统计代码和用户行为日志记录代码分散在各业务模块中,比如在视频模块,要想实现对用户对监控点的实时预览和远程回放行为进行统计, ...

  8. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十 || AOP面向切面编程浅解析:简单日志记录 + 服务切面缓存

    代码已上传Github+Gitee,文末有地址 上回<从壹开始前后端分离[ .NET Core2.0 Api + Vue 2.0 + AOP + 分布式]框架之九 || 依赖注入IoC学习 + ...

  9. 论AOP面向切面编程思想

    原创: eleven 原文:https://mp.weixin.qq.com/s/8klfhCkagOxlF1R0qfZsgg [前言] AOP(Aspect-Oriented Programming ...

  10. 学习笔记: AOP面向切面编程和C#多种实现

    AOP:面向切面编程   编程思想 OOP:一切皆对象,对象交互组成功能,功能叠加组成模块,模块叠加组成系统      类--砖头     系统--房子      类--细胞     系统--人    ...

随机推荐

  1. Python 九九乘法表的多种实现方式

    简介 九九乘法表是初学者学习编程的必要练手题目之一,因此各种语言都有对应的实现方式,而 Python 也不例外.在 Python 中,我们可以使用多种方式来生成一个简单的九九乘法表. 本文共介绍了七种 ...

  2. 浅谈 thinkphp composer 扩展包加载原理

    浅谈 thinkphp composer 扩展包加载原理 本文将介绍 ThinkPHP 中 Composer 扩展包的加载原理,帮助读者更好地理解和应用该功能. 前言 如题,今天感觉好久没有更新博客了 ...

  3. 将前端优化到最低:Web应用程序和移动应用程序最佳实践

    目录 1. 引言 2. 技术原理及概念 3. 实现步骤与流程 4. 应用示例与代码实现讲解 4.1. 应用场景介绍 4.2. 应用实例分析 4.3. 核心代码实现 4.4. 代码讲解说明 将前端优化到 ...

  4. CF1654E Arithmetic Operations 题解

    摘自我的洛谷博客. 题目让我们求改变数字的最少次数,那我们转化一下, 求可以保留最多的数字个数 \(cnt\),再用 \(n\) 减一下就行,即 \(res = n - cnt\). 我们先考虑两种暴 ...

  5. 音视频开发进阶——YUV与RGB的采样与存储格式

    在上一篇文章中,我们带大家了解了视频.图像.像素和色彩之间的关系,还初步认识了两种常用的色彩空间,分别是大家比较熟悉的 RGB,以及更受视频领域青睐的 YUV.今天,我们将继续深入学习 RGB.YUV ...

  6. Flutter系列文章-Flutter基础

    Flutter是Google推出的一种新的移动应用开发框架,允许开发者使用一套代码库同时开发Android和iOS应用.它的设计理念.框架结构.以及对Widget的使用,都让开发者能更有效率地创建高质 ...

  7. 理解ASP.NET Core - 限流(Rate Limiting)

    注:本文隶属于<理解ASP.NET Core>系列文章,请查看置顶博客或点击此处查看全文目录 概述 在微服务化的架构设计中,网关扮演着重要的看门人角色,它所提供的功能之一就是限流.而对于众 ...

  8. os模块常用操作

    作者:Simon0903 链接:https://www.jianshu.com/u/2b4bc3b5e6fc 來源:简书 os.getcwd() #返回当前工作目录 os.chdir(path) #改 ...

  9. Vue中 router与route的区别

    $route对象 该对象表示当前的路由信息,包含当前URL解析得到的信息.包含当前的路径,参数,query对象等.其常用方法如下所示: $route.path 字符串,对应当前路由的路径,总是解析为绝 ...

  10. 随风迎 jmeter下TPS插件的安装(转)

    1.下载插件http://pan.baidu.com/s/1mioVJni 2.解压下载的安装包: 将 jpgc-graphs-basic-2.0.zip 解压缩后只有一个 lib 目录,该目录下有一 ...