Spring5应用之AOP额外功能详解

news2024/11/17 21:17:57

作者简介:☕️大家好,我是Aomsir,一个爱折腾的开发者!
个人主页:Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客
当前专栏:Spring5应用专栏_Aomsir的博客-CSDN博客

文章目录

  • 前言
  • MethodBeforeAdvice详解
    • 实战使用
  • MethodInterceptor详解
  • 总结
  • 参考文献

前言

在之前的文章《Spring5应用之AOP动态代理开发》中,我为大家详细地介绍了如何通过四个简单的步骤来实现AOP动态代理的开发。这四个步骤包括:原始类额外功能切入点整合组装。其中,原始类的开发和整合组装是日常开发中较为常见的内容,因此我们不在此赘述

从本篇文章开始,我会更深入地探讨额外功能和切入点的开发和应用。首先,我们会聚焦于“额外功能”的实现。为了实现这一目标,我们采用了实现MethodBeforeAdvice接口的方法。在接下来的内容中,我将为大家详细解读MethodBeforeAdvice接口,以及与之相关的另一个接口——MethodInterceptor接口

MethodBeforeAdvice详解

MethodBeforeAdvice接口是Spring框架专为我们定制的一个接口。一旦实现了这个接口,我们便能够在原始对象的方法执行前添加自定义的附加操作。既然已对该接口的作用有了初步了解,接下来的焦点将放在这个接口中的唯一方法——before方法上。我们将对此方法以及它的参数进行深入的探讨和分析

  • Method method:代表当前额外功能所增加给的那个原始方法,比如login方法、register方法
  • Object[] args:代表当前额外功能所增加给的那个原始方法的参数列表,
  • Object target:代表当前额外功能所增加给的那个原始对象,比如UserServiceImpl
    在这里插入图片描述

实战使用

虽然上面已经对before方法的三个参数进行了简要的讲解,但在实际操作中,我们又应该如何使用这些参数呢?实际上,在实战中,我们会根据具体的需求来决定是否使用before方法中的参数。有时,我们可能会使用其中的某一个或某几个参数;而有些时候,这些参数可能一个也用不上。这主要是因为MethodBeforeAdvice接口的设计初衷就是只支持在方法执行前插入额外的功能

MethodInterceptor详解

如前所述,MethodBeforeAdvice接口具备某些局限性,特别是它只允许在原始业务方法执行之前插入附加功能。在某些特定应用场景下,例如性能监测,该接口可能并不完全满足需求。这种设计决策意味着它在某些上下文中可能难以为我们提供强有力的支持。然而,Spring已对此进行了深思熟虑,并相应地推出了MethodInterceptor接口。此接口赋予我们更广泛的自由度,允许我们在原始方法执行前、执行后,或前后均加入额外功能。这与我们在《Spring5应用之静态代理开发》中手写的静态代理模式颇为相似。另外,值得一提的是,通过使用MethodInterceptor接口,我们还能对原始方法的返回值进行调整

public class Arround implements MethodInterceptor {

    private static final Logger log = LoggerFactory.getLogger(Arround.class);

    /**
     * 给原始方法添加额外功能(可以运行在原始方法之前或之后),只需要确定原始方法何时执行
     * @param methodInvocation 额外功能所添加的原始方法
     * @return 代理对象的方法的返回值
     * @throws Throwable 异常
     */
    @Override
    public Object invoke(MethodInvocation methodInvocation) throws Throwable {
        log.debug("--额外功能----- 原始方法执行之前");

        // 运行原始方法,返回值为原始方法的返回值
        Object result = null;

        try {
            result = methodInvocation.proceed();
        } catch (Exception e) {
            log.error("--额外功能----- 发生异常后的功能", e);
        }


        log.debug("--额外功能----- 原始方法执行之后");

        return result;
    }
}

总结

在本文中,我们深入探讨了Spring AOP所提供的两个核心接口——MethodBeforeAdviceMethodInterceptor。这两个接口极大地简化了我们在项目中加入额外功能的过程。与静态代理相比,我们无需创建大量的类进行整合,显著提高了开发的便捷性

参考文献

  • 孙哥孙帅suns说Spring5~学不会Spring? 因为你没找对人
  • Spring官方文档

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Doris数据库FE——启动流程源码详细解析

Doris中FE主要负责接收和返回客户端请求、元数据以及集群管理、查询计划生成等工作。代码路径:doris/fe/fe-core/src/main/java/org/apache/doris/DorisFE.java 环境检查 在启动FE的时候,主要做环境检查。检查一些启动时必要的环境变量以及初始化配置…

社区团购新零售搭伙拼团小程序源码(前后端)

社区团购新零售搭伙拼团小程序源码是一款非常实用的电商小程序,它包含了前后端文件, 可以快速地进行部署和使用。该小程序是基于微信小程序开发的,支持社区团购、新零售、搭伙拼团等多种功能。 该小程序具有良好的用户体验,包括…

范数Norm-衡量向量大小的方法

性质 非负性: 范数的值总是非负的,且当且仅当向量全为零时,范数的值为零。 齐次性: 对于任意实数α,有 三角不等式: 对于任意向量x和y,有 常见范数 L1: 向量所有元素绝对值的和,权重稀疏 L2:欧几里得范数,权重平滑 无穷范数:表示向量中最大的元素 为什么使用范…

英飞凌 Tricore 架构中断系统详解

本文以TC3系列MCU为例,先来了解中断源是如何产生的,再看一下CPU是如何处理中断源的。 AURIX TC3XX的中断路由模块 Interrupt Router (IR) 在TC3中,中断既可以被CPU处理,也可以被DMA处理,所以手册中不再把中断称为中断…

vue3硅谷甄选02 | 封装svg组件 - axios二次封装

文章目录 vue3硅谷甄选02功能1:封装svg组件SVG图标配置svg封装成组件svg组件注册为全局组件自定义统一注册全局组件的插件自定义插件的原理插件的使用 app.use(plugin, [options]) 功能2:axios二次封装使用mock插件构造数据axios二次封装api接口统一管理…

【大数据开发技术】实验01-Hadoop安装部署

文章目录 Hadoop安装部署一、实验目标二、实验要求三、实验内容四、实验步骤附:系列文章 Hadoop安装部署 虚拟机数量:3 系统版本:Centos 7.5 Hadoop版本: Apache Hadoop 2.7.3 主节点信息: 操作系统:Cen…

Tomcat 与 JDK 对应版本关系

对应关系 Tomcat版本 jdk版本11.0.x JDK 21及以后10.1.x JDK11及以后10.0.xJDK1.8及以后9.0.x JDK1.8及以后8.5.xJDK1.7及以后8.0.x JDK1.7及以后 查看对应关系方法: 登陆Tomcat官网:Apache Tomcat - Welcome! 结果:

Arthas:Java调试利器使用

Arthas:Java调试利器使用 1. Arthas是什么2. Arthas可以解决什么问题Arthas启动方式1. jar启动2. 在线安装 远程连接命令使用- 退出threadclassloaderscsm watchtrace修改日志级别 1. Arthas是什么 Arthas(阿尔萨斯)是阿里开源的一个Java在线分析诊断工具. 2. Arthas可以解决…

C#(CSharp)入门实践项目(简易回合制游戏)

项目名称 木木夕营救公主 项目介绍 这是一个小游戏,你将扮演一个英雄(木木夕),去打败恶龙,拯救出公主,该项目采用回合制战斗模式,由于角色的血量和攻击为随机数,所以需要靠运气才…

YOLOv7改进:CBAM注意力机制

目录 1.介绍 1.1、论文的出发点 1.2、论文的主要工作 1.3、CBAM模块的具体介绍 2.YOLOv7改进 2.1yaml 配置文件如下 2.2common.py配置 2.3yolo.py配置 1.介绍 1.1、论文的出发点 cnn基于其丰富的表征能力,极大地推动了视觉任务的完成,为了提高…

【MySql】3- 实践篇(一)

文章目录 1. 普通索引和唯一索引的选择1.1 查询过程1.2 更新过程1.2.1 change buffer1.2.2 change buffer 的使用场景 1.3 索引选择和实践1.4 change buffer 和 redo log2. MySQL为何有时会选错索引?2.1 优化器的逻辑2.1.1 扫描行数是怎么判断的?2.1.2 重新统计索引信息 2.2 …

一站式吃鸡利器,提升游戏战斗力,助您稳坐鸡王宝座!

各位吃鸡玩家们,听说过绝地求生作图工具吗?想知道如何提高游戏战斗力、分享顶级作战干货、查询装备皮肤库存?还在为游戏账号安全而担心吗?别急,今天就为您介绍一款一站式吃鸡利器,满足您的所有需求&#xf…

【使用工具】IDEA创建类及已有类添加注释-详细操作

1.背景 很多开发好多时候其实不太会给类添加注释,尤其是已经有的类,上网查询,好多文档错误百出,而且不全 2.正文 2.1新建类添加注释 idea给新建类创建注释有两种方式 先写一个简单的模板 /** * description: TODO * autho…

kotlin协程CoroutineScope Dispatchers.IO launch 线程Id

kotlin协程CoroutineScope Dispatchers.IO launch 线程Id import kotlinx.coroutines.*fun main(args: Array<String>) {println("main 线程id:${Thread.currentThread().threadId()}")CoroutineScope(Dispatchers.IO).launch {println("launch 线程id:$…

【JVM】第二篇 JVM内存模型深度剖析与优化

目录 一. JDK体系结构与跨平台特性介绍二. JVM内存模型深度剖析三. 从Jvisualvm来研究下对象内存流转模型四. GC Root与STW机制五. JVM参数设置通用模型一. JDK体系结构与跨平台特性介绍 二. JVM内存模型深度剖析 按照线程是否共享来划分 TLAB(Thread Local Allocation Buffer…

mybatis核心组件

title: “mybatis核心组件” createTime: 2021-12-08T12:19:5708:00 updateTime: 2021-12-08T12:19:5708:00 draft: false author: “ggball” tags: [“mybatis”] categories: [“java”] description: “mybatis核心组件” #mermaid-svg-AYu4pQutsPsK0P5T {font-family:&quo…

stm32 - 初识2

stm32 - 初识2 工程架构点灯程序寄存器方式点灯库函数的方式点灯 工程架构 启动文件 中断向量表&#xff0c;中断服务函数&#xff0c;其他中断等 中断服务函数中的&#xff0c;复位中断是整个程序的入口&#xff0c;调用systeminit&#xff0c;和main函数 点灯程序 寄存器方式…

自适应阈值分割-OTSU

OTSU 在前面固定阈值中选取了一个阈值为127进行阈值分割&#xff0c;那如何知道选的这个阈值效果好不好呢&#xff1f;答案是&#xff1a;不断尝试&#xff0c;所以这种方法在很多文献中都被称为经验阈值。 Otsu阈值法就提供了一种自动高效的二值化方法。Otsu算法也称最大类间…

C++之std::atomic类模板原子操作应用总结(二百三十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

JAVA+SpringBoot+VUE工厂车间管理系统(含论文)源码

springboot169基于vue的工厂车间管理系统的设计录像(毕业设计jdz2023) 一、源码描述 JAVASpringBootVUE工厂车间管理系统,包含源码数据库论文等,含MySQL脚本&#xff0c;基于B/S和Web开发的&#xff0c;感兴趣的朋友可以下载看看 二、功能介绍 1、个人中心 2、人员管理 3、设备…