Spring之AOP理解与应用(更新中)

1. AOP的认识    

 面向切面编程:基于OOP基础之上新的编程思想,OOP面向的主要对象是类,而AOP面向的主要对象是切面,在处理日志、安全管理、事务管理等方面有非常重要的作用。AOP是Spring中重要的核心点,AOP提供了非常强大的功能,用来对IOC做补充。通俗点说的话就是在程序运行期间,在不修改原有代码的情况下 增强跟主要业务没有关系的公共功能代码到 之前写好的方法中的指定位置 这种编程的方式叫AOP。

        AOP在Spring框架中被用于:

  1. 提供声明式的企业服务。最重要的此类服务是 声明式事务管理。
  2. 让用户实现自定义切面,用AOP补充他们对OOP的使用。 

2. AOP核心概念和术语 

2.1 切面(Aspect)

        指关注点模块化,这个关注点可能会横切多个对象。事务管理是企业级Java应用中有关横切关注点的例子。 在Spring AOP中,切面可以使用通用类基于模式的方式(schema­based approach)或者在普通类中以@Aspect注解(@AspectJ 注解方式)来实现。

2.2  连接点(Join point)

         在程序执行过程中某个特定的点,例如某个方法调用的时间点或者处理异常的时间点。在Spring AOP中,一个连接点总是代表一个方法的执行。

2.3  通知(Advice)

         在切面的某个特定的连接点上执行的动作。通知有多种类型,包括“around”, “before” and “after”等等。通知的类型将在后面的章节进行讨论。 许多AOP框架,包括Spring在内,都是以拦截器做通知模型的,并维护着一个以连接点为中心的拦截器链。

前置通知(Before advice): 在连接点之前运行但无法阻止执行流程进入连接点的通知(除非它引发异常)。

后置返回通知(After returning advice):在连接点正常完成后执行的

通知(例如,当方法没有抛出任何异常并正常返回时)。

后置异常通知(After throwing advice): 在方法抛出异常退出时执行的通知。

后置通知(总会执行)(After (finally) advice): 当连接点退出的时候执行的通知(无论是正常返回还是异常退出)。

环绕通知(Around Advice):环绕连接点的通知,例如方法调用。这是最强大的一种通知类型。环绕通知可以在方法调用前后完成自定义的行为。它可以选择是否继续执行连接点或直接返回自定义的返回值又或抛出异常将执行结束。

2.4 切点(Pointcut)

        匹配连接点的断言。通知和切点表达式相关联,并在满足这个切点的连接点上运行(例如,当执行某个特定名称的方法时)。切点表达式如何和连接点匹配是AOP的核心:Spring默认使用
AspectJ切点语义。

2.5 引入(Introduction)

         声明额外的方法或者某个类型的字段。Spring允许引入新的接口(以及一个对应的实现)到任何被通知的对象上。例如,可以使用引入来使bean实现 IsModified接口, 以便简化缓存机制(在AspectJ社区,引入也被称为内部类型声明(inter))。

2.6 目标对象(Target object)

         被一个或者多个切面所通知的对象。也被称作被通知(advised)对象。既然Spring AOP是通过运行时代理实现的,那么这个对象永远是一个被代理(proxied)的对象。

2.7 AOP代理(AOP proxy)

        AOP框架创建的对象,用来实现切面契约aspect contract)(包括通知方法执行等功能)。在Spring中,AOP代理可以是JDK动态代理或CGLIB代理。

2.8 织入(Weaving)

        把切面连接到其它的应用程序类型或者对象上,并创建一个被被通知的对象的过程。这个过程可以在编译时(例如使用AspectJ编译器)、类加载时或运行时中完成。 Spring和其他纯Java AOP框架一样,是在运行时完成织入的。

3. 一图理解AOP核心概念

        本节是个人对照业务需求对AOP的一些概念的解读。

        我们通过一个场景和一张图通俗的理解一下AOP的切面、通知、连接点和切入点这几个概念;

        场景: 我们有一个日志类,有before()、after()、AfterException()、afterReturn()这几个方法,我们需要记录我们的方法的日志,如果不适用AOP,那么我们就得在每个方法的前面、后面、异常调用这个日志类的方法。如果使用AOP呢? 我们如何理解呢?

        理解:

        切面指的是关注点模块化,那么我们抽出来的日志类是不是就可以理解为一个切面呢?

        切面和我们的业务方法连接的点就是连接点

        通知是运行在连接点上的动作,那么抽出来的这个日志类的方法是不是就可以理解为通知呢?

        切点是匹配连接点的断言,那就是说我们指定哪些需要增强的搭连接点就是切点

        

4. AOP的应用场景

  • 日志管理
  • 权限认证
  • 安全检查
  • 事务控制

5. 如何使用AOP

        本节会通过AOP实现日志记录的需求进行演示如何使用AOP;本案例使用的是基于注解使用AOP;

第一步: 配置AOP的依赖

     <dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.5</version></dependency>

第二步:开启扫面注解

   <!--扫描包:扫描类中所有注解,不扫描注解不是生效--><context:component-scan base-package="cn.learn.aop" ></context:component-scan><!--因为我们使用的是注解方式的AOP,所以要开启注解AOP功能--><aop:aspectj-autoproxy></aop:aspectj-autoproxy>

第三步: 编写切面类

@Aspect    // 标记为切面
@Component // 标记Bean组件, 才能切入到ioc当中的bean
public class LogAspect {// 可以采用 声明切点的方式 让其他通知引用, 更重用性@Pointcut("execution(* cn.myLearnAop.service.impl.*.*(..))")public void pointcut(){}// 前置通知@Before("pointcut()")public void before(JoinPoint joinPoint, Logger logger){// 获取方法名String methodName = joinPoint.getSignature().getName();// 所有的参数Object[] args = joinPoint.getArgs();System.out.println(logger.name()+"方法运行,参数是:"+ Arrays.asList(args)+"注解的值是:");}// 后置通知@After("pointcut()")public void after(JoinPoint joinPoint){// 获取方法名String methodName = joinPoint.getSignature().getName();// 所有的参数Object[] args = joinPoint.getArgs();System.out.println(methodName+"方法运行,参数是:"+ Arrays.asList(args));}// 后置异常通知@AfterThrowing(value="pointcut()",throwing="ex")public void afterThrowing(Exception ex){StringWriter sw = new StringWriter();ex.printStackTrace(new PrintWriter(sw, true));System.out.println("后置异常通知"+sw.getBuffer().toString());}// 后置返回通知@AfterReturning(value="pointcut()",returning = "returnValue")public void afterReturning(Object returnValue){System.out.println("返回值:"+returnValue);}// 环绕@Around("pointcut()")public  Object arround(ProceedingJoinPoint joinPoint){// 获取方法名String methodName = joinPoint.getSignature().getName();// 所有的参数Object[] args = joinPoint.getArgs();Object returnValue="";try {System.out.println("环绕:前置通知:"+methodName+"方法执行,参数:"+Arrays.asList(args));returnValue=joinPoint.proceed();System.out.println("环绕:后置通知:"+methodName+"方法执行,参数:"+Arrays.asList(args));} catch (Throwable throwable) {System.out.println("环绕:异常通知:"+throwable);}finally {System.out.println("环绕:返回通知:"+returnValue);}return returnValue;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/204522.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

别太担心,人类只是把一小部分理性和感性放到了AI里

尽管人工智能&#xff08;AI&#xff09;在许多方面已经取得了重大进展&#xff0c;但它仍然无法完全复制人类的理性和感性。AI目前主要侧重于处理逻辑和分析任务&#xff0c;而人类则具有更复杂的思维能力和情感经验。 人类已经成功地将一些可以数据化和程序化的理性和感性特征…

音频采集的相关基础知识

本文引注: https://zhuanlan.zhihu.com/p/652629744 1.麦克风的种类 (1)模拟麦克风 ECM麦克风&#xff1a;驻极体电容麦克风(ECM)&#xff0c;典型的汽车ECM麦克风是一种将ECM单元与小型放大器电路整合在单个外壳中的装置。放大器提供一个模拟信号&#xff0c;其电压电平允许…

迷你洗衣机哪个牌子好又实惠?口碑最好的小型洗衣机

不得不说洗衣机的发明解放了我们的双手&#xff0c;而我们从小到大就有这个意识&#xff0c;贴身衣物不可以和普通的衣服一起丢进去洗衣机一起&#xff0c;而内衣裤上不仅有肉眼看见的污渍还有手上根本无法消灭的细菌&#xff0c;但是有一款专门可以将衣物上的细菌杀除的内衣洗…

简介vue

目录 一、介绍 渐进式框架​ 单文件组件​ 选项式 API (Options API)​ 组合式 API (Composition API)​ 该选哪一个&#xff1f;​ 创建一个 Vue 应用 应用实例​ 根组件​ DOM 中的根组件模板 应用配置​ 多个应用实例​ 一、介绍 Vue (发音为 /vjuː/&#xff…

CI/CD 构建中能保护好 SSHKEY吗?

目录 背景 方案 编码存储 逐行存储 合并存储 打马赛克 结论 背景 使用极狐GitLab CI/CD&#xff0c;在部署方面&#xff0c;主要有两种方式&#xff1a; 部署到K8S集群 Push模式&#xff1a;流水线通过kubectl执行命令部署&#xff0c;这需要把K8S的权限给流水线&#xf…

2. 两数相加

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 …

C#面向对象

过程类似函数只能执行没有返回值 函数不仅能执行&#xff0c;还可以返回结果 1、面向过程 a 把完成某一需求的所有步骤 从头到尾 逐步实现 b 根据开发需求&#xff0c;将某些 功能独立 的代码 封装 成一个又一个 函数 c 最后完成的代码就是顺序的调用不同的函数 特点 1、…

vue项目多个不同的服务器请求地址管理

vue项目多个不同的服务器请求地址管理 在vue项目开发过程中&#xff0c;获取不同的数据可能会出现需要请求多个不同服务器地址的域名&#xff0c;这个时候需要对不同域名的请求地址进行管理以及跨域的代理。 一、单服务器域名地址的跨域代理和请求配置&#xff1a; 跨域配置&…

【算法萌新闯力扣】:卡牌分组

力扣热题&#xff1a;卡牌分组 一、开篇 今天是备战蓝桥杯的第22天。这道题触及到我好几个知识盲区&#xff0c;以前欠下的债这道题一并补齐&#xff0c;哈希表的遍历、最大公约数与最小公倍数&#xff0c;如果你还没掌握&#xff0c;这道题练起来&#xff01; 二、题目链接:…

为Oracle链接服务器使用分布式事务

1 现象 在SQL Server中创建指向Oracle的链接服务器&#xff0c;SQL语句在事务中向链接服务器插入数据。返回链接服务器无法启动分布式事务的报错。 2 解决 在Windows平台下&#xff0c;SQL Server依赖分布式事务协调器&#xff08;MSDTC&#xff09;来使用分布式事务&#xff0…

【ArcGIS Pro微课1000例】0038:基于ArcGIS Pro的人口密度分析与制图

文章目录 一、人口密度二、人口密度分析1. 点密度分析2. 核密度分析三、结果比对一、人口密度 人口密度是指单位土地面积上居住的人口数,通常以每平方千米或每公顷内的常住人口为单位计算。人口密度同资源、经济密切结合,因此,科学准确地分析人口密度的分布情况,对合理制定…

亚信科技AntDB数据库与库瀚存储方案完成兼容性互认证

近日&#xff0c;亚信科技AntDB数据库与苏州库瀚信息科技有限公司自主研发的RISC-V数据库存储解决方案进行了产品兼容测试。经过双方团队的严格测试&#xff0c;亚信科技AntDB数据库与库瀚数据库存储解决方案完全兼容、运行稳定。除高可用性测试外&#xff0c;双方进一步开展TP…

0 NLP: 数据获取与EDA

0数据准备与分析 二分类任务&#xff0c;正负样本共计6W&#xff1b; 数据集下载 https://github.com/SophonPlus/ChineseNlpCorpus/raw/master/datasets/online_shopping_10_cats/online_shopping_10_cats.zip 样本的分布 正负样本中评论字段的长度 &#xff0c;超过500的都…

Redis深入理解-主从架构下内核数据结构、主从同步以及主节点选举

Redis 主从挂载后的内核数据结构分析 主节点中&#xff0c;会通过 clusteNode 中的 slaves 来记录该主节点包含了哪些从节点&#xff0c;这个 slaves 是一个指向 *clusterNode[] 数组的数据结构从节点中&#xff0c;会通过 clusterNode 中的 slaveof 来记录该从节点属于哪个主…

webpack项目工程初始化

一、初始化项目 默认系统已经安装node //初始化 pnpm init//安装webpack pnpm i -D webpack webpack-cli 新建一个index.html的入口文件 新建一个src文件存放js代码&#xff0c;src里面新建一个index.js package.josn配置打包命令 {"name": "webpack-cs&q…

【数据结构】八大排序(二)

目录 前言&#xff1a; 冒泡排序 冒泡排序代码实现 冒泡排序特性总结 快速排序 单趟排序hoare版本 单趟排序挖坑法 单趟排序快慢指针法 快速排序整体概览 快排的优化 三数取中法选key 小区间优化 前言&#xff1a; 上文介绍了直接插入排序&#xff0c;希尔排序&…

2 线、3 线和 4 线 RTD 配置之间有什么区别?

电阻温度检测器 (RTD) 是温度传感器的一种&#xff0c;由于其准确性、可重复性和稳定性而广泛应用于各种工业应用。这些设备通过感测材料温度变化时电阻的变化来测量温度。 RTD 探头有多种配置&#xff0c;包括 2 线、3 线和 4 线型号。这些类型之间存在显着差异&#xff0c;在…

浅析函数防抖节流

防抖和节流都是前端开发中常用的优化性能的技术。 一、定义 防抖&#xff1a; 防抖指的是在事件触发后&#xff0c;在规定的时间内若再次触发&#xff0c;则重新计时&#xff0c;直到规定时间内没有再次触发事件&#xff0c;才执行事件处理。这样可以避免在短时间内频繁地触发…

ArrayList与顺序表的简单理解

前言----list 在集合框架中&#xff0c;List是一个接口&#xff0c;继承自Collection。Collection也是一个接口&#xff0c;该接口中规范了后序容器中常用的一些方法&#xff0c;具体如下所示&#xff1a; Iterable也是一个接口&#xff0c;表示实现该接口的类是可以逐个元素进…

编写安全 JavaScript 代码的最佳实践

编写安全 JavaScript 代码的最佳实践 JavaScript 的动态特性使其成为事实上的浏览器语言和世界上最流行的编程语言。 JS 最受欢迎的有用功能之一是即时分析。这意味着浏览器在下载内容的同时执行代码&#xff0c;这显然有其优势。然而&#xff0c;这种程度的自由也伴随着问题…