Spring挖掘:(AOP篇)

学习AOP时,我们首先来了解一下何为AOP

一. 概念

AOP(面向切面编程,Aspect Oriented Programming)是一种编程技术,旨在通过预编译方式或运行期动态代理实现程序功能的统一管理和增强。AOP的主要目标是在不改变原有业务逻辑代码的基础上,添加或修改非核心业务逻辑,如日志记录、性能监控、安全检查等。这种方式有助于减少代码重复,提高代码的模块化程度,降低系统组件间的耦合度,进而提升软件的可维护性和可扩展性。

AOP的核心概念包括:

切面(Aspect):切面是关注点的模块化,它横切多个对象。例如,事务管理就是一个典型的切面。

连接点(Join Point):程序执行过程中的某个点,如方法调用或异常抛出。AOP框架会在这个点上应用切面。

通知(Advice):切面在特定的连接点上执行的动作。根据调用时机不同,通知分为前置通知、后置通知、环绕通知等。

切入点(Pointcut):定义了通知应该应用于哪些连接点的规则。它是切面的一个组成部分。

用图来表示

注意的是:所有方法都是一个连接点,而我们需要增强的就是一个切入点

二. 底层

AOP其实是基于代理模式来实现的.而在Java当中,分为静态代理和动态代理两种模式.

简单描述一下静态代理,着重表示一下动态代理.

2.1 静态代理

静态代理: 你可以理解为就是硬编码, 例如现在一个计算器类,分别有加减乘除功能.而此时你想增强这些方法,例如在这些方法上面添加一些日志,那静态代理的实现就是创建一个新的类,聚合一下这个计算器类,也实现计算器类实现的接口,也就是加减乘除. 去实现具体的加减乘除时还是调用原本计算器类的方法,只是在调用这个方法前后可以书写你要增加的逻辑.

2.2 动态代理

在动态代理当中我们分为两种代理方式.

2.2.1 JDK动态代理

JDK的代理是基于接口实现的.如果一个类没有实现接口,是不可以使用JDK的动态代理的.

2.2.1.1 演示

我通过一个火车站售票的一个场景来演示一下动态代理是怎么实现的.

创建一个售票的接口,里面有两个方法,一个售票,一个打印

创建一个火车站类,实现这个接口

在JDK中,我们可以调用Proxy.newProxyInstance()方法来获取一个代理对象.

  • 第一个参数为加载当前需要代理的类的类加载器,
  • 第二个参数为需要代理的类的实现的接口(这也就证明是基于接口来实现的)
  • 第三个参数需要一个实现InvocationHandler接口的类,可以用匿名内部类来实现,这一块也就是用来增加逻辑的一块.

我们创建一个代理工厂的类来实现这段逻辑

测试类

测试结果

2.2.2 CGLIB动态代理

CGLIB是可以基于接口也可以基于类实现的.

2.2.2.1 演示

还是买票这个例子,只不过我们换种实现.

而使用CGLIB代理时,我们需要去实现MethodInterceptor接口,创建代理对象时,需要使用CGLIB提供的Enhance类来实现.

这里使用了三个方法.

setInterfaces与setSuperclass通过方法名我们知道,是用来设置代理类的接口与父类.侧面也证实了CGLIB是可以基于接口和类实现的.

而setCallback的作用是设置回调对象,回调对象在CGLIB生成的代理对象中用于处理方法调用。具体来说:

  • 当通过代理对象调用方法时,CGLIB会拦截该方法调用,并将控制权交给回调对象。
  • 回调对象可以对方法调用进行增强处理,如添加日志、事务管理、权限检查等。
  • 在这个例子中,回调对象被设置为当前对象(this),意味着当前对象需要实现CGLIB的回调接口(如MethodInterceptor),以便在方法调用时执行特定的逻辑.

所以这就是为什么需要实现MethodInterceptor方法.

测试类

测试结果

我们尝试将Transtaion实现的接口不实现,看能否代理成功

测试类

测试结果

我们清晰看到代理没有任何问题,也是通过代理对象调用的.

二. AOP实战演练

我们简单书写一个计算机的工具类

现在我们来书写一个AOP切面类.

介绍一下这里使用到的几个重要注解的作用

  • @Aspect(切面类): 声明此类为一个AOP切面类,需要扫描方法上Before等注解
  • @PointCut(切入点): 切入点表达式,选取对应的连接点来作为切入点
    • execution: 切入点表达式,以 返回值 + [全限类名] + 方法名(参数类型),* 指代任意类型
  • @Before(前置通知): 方法调用前执行
  • @After(后置通知): 方法调用后执行
  • @AfterThrowing(异常后通知): 方法执行时发生异常执行
  • @AfterReturning(方法返回后通知): 方法能正确返回值执行.

他们的调度过程可以用一张图来表示

我们执行测试类来查看测试结果

这里有两个细节

  • 第一个表明了AOP拦截的执行顺序为前置,返回(无异常时),后置
  • 第二个表明,我们查看到实际上执行对应方法的是代理对象,而更注意的是SpringBoot的底层使用的是CGLIB代理.但实际上我们还看到一个执行对象就是我们具体的实现CaculatorImpl,这两个是不一样的,在使用add方法的入口时,使用的是AOP代理对象,而实际去执行方法时,还是调用我们实现的CaculatorImpl去实现的.

这就是我们基于Spring AOP来简单实现了一下如何应用.

那么复杂一点的情形,现在有两个切面类同时应用到了同一个方法,那么又会是怎么样的情形呢?

我们再书写一个权限的切面类,来查看会有什么现象产生

同样启动我们的测试实例,来查看效果

我们观察到执行顺序如下面这一张图来表示

所以我们了解到有AOP嵌套时的,执行顺序会变成这样的流程,会把另一个AOP的过程当成整体作为执行流程.

还有一个情形,就是当我们使用环绕通知时,我们是可以利用环绕通知模拟这四个情形,我们修改我们原来日志的代码

利用环绕通知来模拟四种情形,启动一下测试

至此AOP基本功能我们都测试完毕,还有一种情形我们一直没有探究,当我们执行时出现异常时,AOP的执行流程是什么样子的呢?

测试结果为 前置 -> 执行 -> 异常 -> 后置

那我们再开启一下我们之前的权限AOP,我们捕获了异常,此时会发生什么现象呢?(由于异常日志太多,我这里捕获异常就不打印啦)

在权限这里,我们发现他并没有走异常处理的增强,执行流程为下方图示这样

所以,我们通常建议环绕通知时,捕获异常后,继续往上抛出异常,让其他的AOP对象感知到异常的存在,执行对应的异常处理.

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

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

相关文章

Centos Linux 7 搭建邮件服务器(postfix + dovecot)

准备工作 1. 一台公网服务器(需要不被服务商限制发件收件的,也就是端口25、110、143、465、587、993、995不被限制),如有防火墙或安全组需要把这些端口开放 2. 一个域名,最好是com cn org的一级域名 3. 域名备案&am…

深入了解Bootstrap框架:从入门到精通

文章目录 前言Bootstrap的核心特性1. 响应式设计2. 丰富的组件库3. 易于使用4. 良好的兼容性 安装与使用安装1. 通过CDN引入2. 下载源码3. 使用npm或yarn 基本使用1. 栅格系统2. 按钮3. 导航条4. 卡片5. 模态框6. 轮播图7. 表单 高级定制1. 修改 Sass 变量2. 按需引入组件 最佳…

ENSP RIP动态路由

RIP(距离矢量路由协议)以网络中所有链路的距离和矢量为依据计算最佳路径,是第一个动态路由协议。条数作为唯一的度量单位。默认开启水平分割(从一个路由接口学到的路由信息,便不在从这个接口发送出去)防止路…

华为海思招聘-芯片与器件设计工程师-模拟芯片方向- 机试题-真题套题题目——共8套(每套四十题)

华为海思招聘-芯片与器件设计工程师-模拟芯片方向- 机试题-真题套题题目分享——共九套(每套四十题) 岗位——芯片与器件设计工程师 岗位意向——模拟芯片 真题题目分享,完整题目,无答案(共8套) 实习岗位…

MySQL45讲 第十一讲 怎么给字符串字段加索引?

文章目录 MySQL45讲 第十一讲 怎么给字符串字段加索引?一、引言二、前缀索引(一)概念与创建方式(二)数据结构与存储差异(三)确定前缀长度的方法 三、前缀索引对覆盖索引的影响四、其他索引创建方…

字节青训-小S的倒排索引

问题描述 小S正在帮助她的朋友们建立一个搜索引擎。为了让用户能够更快地找到他们感兴趣的帖子,小S决定使用倒排索引。倒排索引的工作原理是:每个单词都会关联一个帖子ID的列表,这些帖子包含该单词,且ID按从小到大的顺序排列。 例…

讲讲分布式与集群的区别?

大家好,我是锋哥。今天分享关于【讲讲分布式与集群的区别?】面试题。希望对大家有帮助; 讲讲分布式与集群的区别? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在现代计算和信息技术领域,分布式系统和集…

大数据新视界 -- 大数据大厂之 Impala 性能优化:解锁大数据分析的速度密码(上)(1/30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

大数据新视界 -- 大数据大厂之 Impala 性能优化:数据存储分区的艺术与实践(下)(2/30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

【实用教程】Blazor 文件管理器中引入分页功能

分页是一项重要功能,可帮助我们有效地加载大量数据。我们的 Syncfusion Blazor 文件管理器允许在分段页面中显示文件和文件夹,从而更轻松地浏览大型目录。在文件管理器组件中处理大量数据时,此功能非常方便。此功能可用于有效地加载大量数据。…

C++上机实验|多态性编程练习

1.实验目的 (1)理解多态性的概念。 (2)掌握如何用虚函数实现动态联编 (3)掌握如何利用虚基类。 2.实验内容 设计一个飞机类 plane,由它派生出歼击机类fighter和轰炸机类 bomber,歼击机类fighter 和轰炸机类bomber 又共同派生出歼轰机(多用途战斗机)。利用虚函数和虚基类描述…

CSS弹性布局:灵活布局的终极指南

在网页设计中,CSS 弹性布局(Flexbox)是一个不可或缺的工具。它能帮助你轻松地排列和对齐元素,尤其是在响应式设计中表现出色。今天,我们就来深入探讨一下 Flexbox 的各个属性,让你彻底掌握这个强大的布局工…

Java:二维数组

目录 1. 二维数组的基础格式 1.1 二维数组变量的创建 —— 3种形式 1.2 二维数组的初始化 \1 动态初始化 \2 静态初始化 2. 二维数组的大小 和 内存分配 3. 二维数组的不规则初始化 4. 遍历二维数组 4.1 for循环 ​编辑 4.2 for-each循环 5. 二维数组 与 方法 5.1…

SQL,力扣题目1767,寻找没有被执行的任务对【递归】

一、力扣链接 LeetCode_1767 二、题目描述 表:Tasks ------------------------- | Column Name | Type | ------------------------- | task_id | int | | subtasks_count | int | ------------------------- task_id 具有唯一值的列。 ta…

Spring Security-02-Spring Security认证方式-HTTP基本认证、Form表单认证、HTTP摘要认证、前后端分离安全处理方案

Lison <dreamlison163.com>, v1.0.0, 2024.06.01 Spring Security-02-Spring Security认证方式-HTTP基本认证、Form表单认证、HTTP摘要认证、前后端分离安全处理方案 文章目录 Spring Security-02-Spring Security认证方式-HTTP基本认证、Form表单认证、HTTP摘要认证、…

3.1、软件需求分析

软件需求分析 1、 需求分析定义及获取2、 需求分析过程2.1 需求提炼2.2 需求描述2.3 需求验证 3、 需求分析任务3.1 软件需求规格文档编制沟通活动通用任务集软件需求规格说明的原则软件需求规格说明的结构 1、 需求分析定义及获取 需求分析&#xff1a;确定系统必须具有的功能…

qt QStandardItemModel详解

1、概述 QStandardItemModel是Qt框架中提供的一个基于项的模型类&#xff0c;用于存储和管理数据&#xff0c;这些数据可以以表格的形式展示在视图控件&#xff08;如QTableView、QTreeView等&#xff09;中。QStandardItemModel支持丰富的数据操作&#xff0c;包括添加、删除…

Ubuntu18.04更换PREEMPT RT内核

文章目录 1 安装环境2 下载实时内核3 安装必要库和软件4 配置4.1 解压kernel压缩包4.2 进入kernel文件夹4.2.1 操作步骤4.2.2 修改配置文件 5 构建和安装6 启动显示内核选择界面7 启动界面选择实时内核版本进入8 uname -a查看操作系统内核信息 1 安装环境 Ubuntu 18.04原生内核…

立冬到了,选择Codigger暖心陪伴

立冬了&#xff0c;寒风渐起&#xff0c;但Codigger开发者们依然热情如火&#xff0c;编程的热情不会因为冬天而减退&#xff0c;相反&#xff0c;更加激情澎湃。就像立冬的清晨&#xff0c;虽然寒冷&#xff0c;却有着一种清新的气息&#xff0c;让我们一起迎接新的挑战&#…

全文检索ElasticSearch到底是什么?

学习ElasticSearch之前&#xff0c;我们先来了解一下搜索 1 搜索是什么 ① 概念&#xff1a;用户输入想要的关键词&#xff0c;返回含有该关键词的所有信息。 ② 场景&#xff1a; ​ 1互联网搜索&#xff1a;谷歌、百度、各种新闻首页&#xff1b; ​ 2 站内搜索&#xff…