AOP(面向切面编程)
什么是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(面向切面编程)的更多相关文章
- AOP 面向切面编程, Attribute在项目中的应用
一.AOP(面向切面编程)简介 在我们平时的开发中,我们一般都是面对对象编程,面向对象的特点是继承.多态和封装,我们的业务逻辑代码主要是写在这一个个的类中,但我们在实现业务的同时,难免也到多个重复的操 ...
- AOP面向切面编程的四种实现
一.AOP(面向切面编程)的四种实现分别为最原始的经典AOP.代理工厂bean(ProxyFacteryBean)和默认自动代理DefaultAdvisorAutoProxyCreator以及Bea ...
- Javascript aop(面向切面编程)之around(环绕)
Aop又叫面向切面编程,其中“通知”是切面的具体实现,分为before(前置通知).after(后置通知).around(环绕通知),用过spring的同学肯定对它非常熟悉,而在js中,AOP是一个被 ...
- Method Swizzling和AOP(面向切面编程)实践
Method Swizzling和AOP(面向切面编程)实践 参考: http://www.cocoachina.com/ios/20150120/10959.html 上一篇介绍了 Objectiv ...
- [转] AOP面向切面编程
AOP面向切面编程 AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术. ...
- C# AOP 面向切面编程之 调用拦截
有时候我们需要在代码中对方法调用进行拦截,并修改参数和返回值,这种操作叫做AOP(面向切面编程) 不过需要注意的是,AOP的效率很慢,在需要高效率场合慎用. 以下是C#的AOP方法: 首先建立一个控制 ...
- 【原创】Android AOP面向切面编程AspectJ
一.背景: 在项目开发中,对 App 客户端重构后,发现用于统计用户行为的友盟统计代码和用户行为日志记录代码分散在各业务模块中,比如在视频模块,要想实现对用户对监控点的实时预览和远程回放行为进行统计, ...
- 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十 || AOP面向切面编程浅解析:简单日志记录 + 服务切面缓存
代码已上传Github+Gitee,文末有地址 上回<从壹开始前后端分离[ .NET Core2.0 Api + Vue 2.0 + AOP + 分布式]框架之九 || 依赖注入IoC学习 + ...
- 论AOP面向切面编程思想
原创: eleven 原文:https://mp.weixin.qq.com/s/8klfhCkagOxlF1R0qfZsgg [前言] AOP(Aspect-Oriented Programming ...
- 学习笔记: AOP面向切面编程和C#多种实现
AOP:面向切面编程 编程思想 OOP:一切皆对象,对象交互组成功能,功能叠加组成模块,模块叠加组成系统 类--砖头 系统--房子 类--细胞 系统--人 ...
随机推荐
- 记一次加锁导致ECS服务器CPU飙高的处理
导航 火线告警,CPU飚了 版本回退,迅速救火 猜测:分布式锁是罪魁祸首 代码重构,星夜上线 防患未然,功能可开关 高度戒备,应对早高峰 实时调整方案,稳了 结语 参考 本文首发于智客工坊-<记 ...
- Min-25 筛学习笔记
Min-25 筛学习笔记 \(\text{By DaiRuiChen007}\) 一.简要介绍 Min-25 筛,是一种能在亚线性时间内求出特定的一类积性函数 \(f(i)\) 的前缀和的算法. 具体 ...
- CF1794B Not Dividing题解
如果 \(a_i\) 可以整除 \(a_{i - 1}\),只要在 \(a_i\) 上 \(+1\) 即可,这样 \(a_i \bmod a_{i - 1} = 1\) 就满足题目要求了,如果这样算来 ...
- Hexo博客Next6.0版本主题配置(站内搜索、新建404界面、静态资源压缩、底部信息隐藏、各版块透明度修改、字数统计、推荐阅读、博文置顶、阅读进度、在线评论、运行时间)
新建404界面 在站点根目录下,输入hexo new page 404,在默认Hexo站点下/source/404/index.md 打开新建的404界面,编辑属于自己的404界面,可以显示腾讯公益4 ...
- 从TL、ITL到TT
1.概述 ThreadLocal(TL)是Java中一种线程局部变量实现机制,他为每个线程提供一个单独的变量副本,保证多线程场景下,变量的线程安全.经常用于代替参数的显式传递. Inheritable ...
- 三级缓存---解决 Spring 循环依赖
1. 循环依赖 1.1 什么是循环依赖 首先,什么是循环依赖?这个其实好理解,就是两个 Bean 互相依赖,类似下面这样: """ @Service public cla ...
- 现代C++(Modern C++)基本用法实践:N、其他零散的常用特性
概述 这一篇简单介绍一些其他的比较实用的特性,如果读者想了解现代C++的全部特性,参考:cpp reference 其他特性 预置和弃置函数default&delete 在 C++11 中引入 ...
- Linux 如何删除乱码的文件
事情是这样,服务器很多人在使用,以前的离职同事留了一大堆不知道是什么东西. 那些文件看不了,又删不掉,非常碍眼. 我搜索了挺多资料,没有一篇文章能真的解决问题(感觉都是抄来抄去的). 用 SFTP 工 ...
- jdbc-plus是一款基于JdbcTemplate增强工具包,基于JdbcTemplate已实现分页、多租户、动态表名等插件,可与mybatis、mybatis-plus等混合使用
jdbc-plus简介 jdbc-plus是一款基于JdbcTemplate增强工具包,基于JdbcTemplate已实现分页.多租户.动态表名等插件,可与mybatis.mybatis-plus等混 ...
- Jedis 参数异常引发服务雪崩案例分析
作者:vivo 互联网服务器团队 - Wang Zhi Redis 作为互联网业务首选的远程缓存工具而被大面积使用,作为访问客户端的 Jedis 同样被大面积使用.本文主要分析 Redis3.x 版本 ...