当前位置: 首页 > news >正文

JavaWeb - ⭐ AOP 面相切面编程原理及用户校验功能实战

一、概述

  1. 定义: AOP (Aspect Oriented Programming 面向切面编程) ,一种面向方法编程的思想

  2. 功能:管理 bean 对象的过程中,通过底层的动态代理机制对特定方法进行功能的增强或改变

  3. 实现方式:动态代理技术,即创建目标对象的代理对象,并对目标对象中的方法的功能进行增强的技术

  4. 优点

    1. 代码无侵入:不修改原有代码的基础上对原有方法的功能进行增强
    2. 减少重复代码:一次性对一类方法进行功能增强
    3. 提高开发效率
    4. 维护方便
  5. AOP 的依赖

    <dependency> <groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    
  6. 代理方式

    • 没有切面的对象:不需要代理,Spring 会直接注入目标对象(原始类的实例)
    • **接口类型的目标对象:**Spring 使用 JDK 动态代理 创建代理对象
    • 非接口类型的目标对象(如纯类):Spring 则使用 CGLIB(子类代理) 创建代理对象

二、核心概念

  1. JoinPoint : 连接点,客观可以被 Proxy 的方法(实际上所有的方法都是 JoinPoint,都可以被代理)
  2. PointCut : 切入点,主观需要被 Proxy 的方法(满足匹配条件的 JoinPoint),实际被 Advice 控制的方法
  3. Advice : 通知,共性的功能 (最终体现为一个方法),是对目标 PointCut 的相同处理逻辑
  4. Aspect : 切面,即 PointCut + Advice ,描述 “通知” 与 “切入点” 对应关系
  5. Target : Advice 作用的目标对象,PointCut 所在的类

Aspect 类 (AOP 类)

  1. 定义 : 切面,即 PointCut + Advice ,描述 “通知” 与 “切入点” 对应关系
  2. 功能:用于实现特定切面功能,动态代理某些目标类或目标方法的切面类
  3. 组成
    1. Aspect 类:通过 @Aspect 注解标注,告知 Spring 这是一个 AOP 类
    2. PointCut 切入点:通过 @PointCut 注解标注,指定代理的目标方法,减少 Advice 类型注解中的代码冗余
    3. Advice 方法:通过 Advice 注解标注(如 @Before、@After、@Around ),告知 Spring 这个 Aspect 方法将代理哪些目标方法

PointCut (切入点)

  1. 定义 : 切入点,主观需要被 Proxy 的方法(满足匹配条件的 JoinPoint),实际被 Advice 控制的方法
  2. 功能:用于指定 Aspect 代理的具体方法,抽取出公共切入点减少代码冗余(实际上也可以不单独声明,直接在 Advice 里面声明)
  3. 实现方式:通过 execution 和 annotation 两种方式声明
  4. 书写建议
    1. 建议抽取公共的 PointCut 进行复用(也可以不声明单独的 PointCut,而是在 Advice 方法上的注解中声明 PointCut)
    2. 尽量缩小切入点范围,(比如 : 尽量不用 .. 进行包名匹配,因为范围越大匹配效率越低)
    3. 基于接口描述切入点,而不是直接描述实现类,增强拓展性

execution 表达式

  1. 格式

    execution ( [访问修饰符] 返回值 [包名.类名.] 方法名(方法形参) [throws 异常] )
    
  2. 使用方法

    1. 将目标方法 (被代理的方法) 写到 execution 表达式中
    2. 在 Aspect 类中定义一个空参空返回值方法,给其加上 @PointCut( “execution ...” ) 注解
  3. 书写格式

    1. * :通配1个或0个单独的任意符号,可以通配返回值、包名、类名、方法名、任意类型的一个参数,或者包名、类名、方法名的一部分
    2. .. :通配多个连续的任意符号,可以通配任意层级的包,或任意类型、任意个数的参数
    3. || && ! :可以用逻辑运算符组合复杂的 PointCut 表达式
  • 示例

    @Pointcut("execution(* com.tlias.service.impl.DeptServiceImpl.*(..))")
    private void myPointCut();
    
    • 第一个 * :前面为任意类型的返回值
    • 包名: PointCut 所在的包名类名方法名
    • 最后一个 * :为任意方法
    • (..) :为任意形参

annotation 表达式

  1. 格式

    @annotation(包名.类名.注解名)
    
  2. 使用方法

    1. 在目标方法 (被代理的方法) 上加上自定义的注解 @MyPointCut
    2. 在 Aspect 类中定义一个空参空返回值方法,给其加上 @PointCut( “@annotation(com.xxx.aop.MyPointCut)” ) 注解
  • 示例
    1. 目标:自定义 annotation,被这个 annotation 标注的方法都会被 Aspect 类代理

    2. annotation

      @Target(ElementType.METHOD)                  // 设置注解使用的位置,ElementType.METHOD 表示这个注解用来标注方法
      @Retention(RetentionPolicy.RUNTIME)          // 设置注解生效的时间,RetentionPolicy.RUNTIME 表示运行时生效
      public @interface MyPointCut {
      }
      
    3. PointCut

      @Slf4j
      @Component
      @Aspect
      public class MyAspect{@Pointcut("execution(* com.tlias.service.impl.DeptServiceImpl.*(..)) && @annotation(com.tlias.annotation.MyPointCut)")private void myPointCut();@Around("myPointCut()")public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{log.info("around before ...");Object result = proceedingJoinPoint.proceed();log.info("around after ...");return result;}}
      

Advice (通知)

  1. 定义:通知(Advice)是自定义的处理逻辑,当被 PointCut 选中的方法在指定时机(Before/Around/After)执行时会触发对应的 Advice 方法

  2. 功能 : 明确 PointCut 指定的方法的切面处理逻辑,此方法中会通过 ProceedingJoinPoint 类来代理目标方法

  3. 基本类型

    注解类型说明
    @Before前置通知,Advice 方法在目标方法开始前执行
    @Around环绕通知,Advice 方法在目标方法前后都会执行,期间需要通过 proceed() 方法主动调用目标方法
    @After后置通知,Advice 方法在目标方法结束后执行,有无异常都会执行
    @AfterReturning返回后通知,Advice 方法在目标方法后被执行,有异常则不会执行
    @AfterThrowing异常后通知,Advice 方法在目标方法发生异常后执行
  4. 对比总结

    切面注解运行时机可修改目标方法行为可获取返回值可获取异常
    @Before目标方法执行前
    @Around方法执行前、执行后均可运行☑️☑️☑️
    @After目标方法执行后(无论成功或失败)
    @AfterReturning目标方法成功返回后☑️
    @AfterThrowing目标方法抛出异常时☑️
  5. 自定义优先级:通过 @Order(x) 给 Advice 指定优先级,注解中 x 越大,则 Before 越先执行,After 越后执行

  • 示例

    @Slf4j
    @Component
    @Aspect
    public class MyAspect{// 声明一个 PointCut 切入点, 用于后续 Advice 方法中的切入点复用@Pointcut("execution(* com.tlias.service.impl.DeptServiceImpl.*(..)) && @annotation(com.tlias.annotation.MyPointCut)")private void myPointCut();@Before("myPointCut()")public void before(){log.info("before...");}@Around("myPointCut()")public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{log.info("around before ...");Object result = proceedingJoinPoint.proceed();log.info("around after ...");return result;}@After("myPointCut()")public void after(){log.info("after ...");}@AfterReturning("myPointCut()")public void afterReturning(){log.info("afterReturning ...");}@AfterThrowing("myPointCut()")public void afterThrowing(){log.info("afterThrowing ...");}}
    

JoinPoint(连接点)

  1. 定义

    1. JoinPoint:目标对象中所有可以被增强的方法。这些方法在运行时都可以被 AOP 框架拦截并添加额外的处理逻辑
    2. ProceedingJoinPoint:继承自 JoinPoint 类,专门给环绕通知 (Around) 使用的类,用于代理原有方法的类 (对被拦截方法的一个包装)
  2. 功能:拿到 ProceedingJoinPoint 类相当于拿到了原方法,可以调用 proceed() 方法执行原方法

  3. 常用方法

    方法说明
    proceed()执行被代理的方法
    getArgs()获取传递给目标方法的参数
    getSignature()获取被拦截方法的信息,如方法名、返回类型等(通过反射获取)
    getTarget()获取被拦截方法所属的目标对象(Target Object)
    getThis()获取代理对象(Proxy Object)
  • 示例

    @Around("execution (* com.tlias.service.*.*(..))")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable{// 获取目标对象类名String className = joinPoint.getTarget().getClass().getName();log.info("目标对象的类名:{}", className);// 获取目标方法的方法名String methodName = joinPoint.getSignature().getName();log.info("目标方法的方法名:{}", methodName);// 获取目标方法运行时传入的参数Object[] args = joinPoint.getArgs();log.info("目标方法运行时传入的参数:{}", Arrays.toString(args));// 获取目标方法运行的返回值Object result = joinPoint.proceed();log.info("目标方法运行的返回值:{}", result);// 最后一定要将结果返回回去,因为此时 around 函数代理了 JoinPoint 函数// 不返回的话 controller 层拿不到返回结果return result;
    }
    

三、执行流程

@Around 流程

  1. 声明切入点:Aspect 类声明将会代理的目标方法(根据 @Around 注解配置的 PointCut 信息决定代理哪些方法)
  2. 依赖注入:Spring 通过动态代理技术,注入代理对象 XxxServiceProxy(如果没有配置 Aspect,则直接注入目标对象 XxxService)
  3. 接收请求:服务器接收客户端 ”调用了被代理的方法(目标方法)“ 的请求
  4. 代理方法:XxxServiceProxy 代理类接收请求,通过 ProceedingJoinPoint 参数获取 PointCut 方法的上下文信息
  5. 执行前置代理逻辑:运行 Aspect 前置代码部分 ( Advice 部分 )
  6. 执行目标方法:通过 joinPoint.proceed() 执行被代理的方法,同时用 Object result 接收被代理方法的返回值
  7. 执行后置代理逻辑:运行 Aspect 后置代码部分 ( Advice 部分 )
  8. 返回结果值

@Before / @After 流程

  1. 声明切入点:Aspect 类声明将会代理的目标方法(根据 @Before、@After 等注解配置的 PointCut 信息决定代理哪些方法)
  2. 依赖注入:Spring 通过动态代理技术,注入代理对象 XxxServiceProxy(如果没有配置 Aspect,则直接注入目标对象 XxxService)
  3. 接收请求:服务器接收客户端 ”调用了被代理的方法(目标方法)“ 的请求
  4. 代理方法:XxxServiceProxy 接收请求
  5. 运行 Before Advice:运行 @Before 注解的方法逻辑
  6. 执行目标方法:代理对象自动执行目标方法
  7. 运行 After Advice:运行 @After 注解的方法逻辑
  8. 返回结果值

四、使用场景

  1. 记录操作日志
  2. 权限控制
  3. 事务管理
  4. 自动填充数据库字段

五、示例

方法用时统计

  1. 目标 : 统计各个业务层方法执行耗时
  2. 步骤
    1. 导入依赖:在 pom.xml 中导入 AOP 依赖

      <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
      </dependency>
      
    2. 创建包和类 : com.tlias.aop.TimeAspect

    3. 编写 AOP 程序

      @Aspect    // 声明这是一个AOP类
      @Component
      public class TimeAspect{@PointCut("execution (* com.tlias.service.*.*(..))")private void myPointCut(){}@Around("myPointCut()")    // 声明这个Aspect将代理哪些方法public Object recordTime(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{long begin = System.currentTimeMills();                //1. 记录开始时间Object result = proceedingJoinPoint.prceed();          //2. 调用被代理的方法long end = System.currentTimeMills();                	 //3. 记录结束时间log.info(prceedingJoinPoint.getSignature() + "方法执行共耗时" + end-begin + "毫秒");    		//4. 计算时间差并记录return result;}
      

用户权限校验

  1. 目标 : 保证 @authCheck 注解标注的方法都必须具备特定权限才可调用该方法
  2. 步骤
    1. 导入依赖:在 pom.xml 中导入 AOP 依赖

      <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
      </dependency>
      
    2. 编写注解(com.yupi.yudada.annotation.AuthCheck)

      @Target(ElemType.METHOD)
      @Retention(RetentionPolicy.RUNTIME)
      public @interface AuthCheck {/*** 被 AuchCheck 标注就必须具备的用户权限等级* 示例: @AuthCheck("ADMIN") 表示当前方法必须拥有管理员权限才可执行**/String mustRole() default "";
      
    3. 编写 AOP 程序(com.yupi.yudada.aop.AuthInterceptor)

      @Aspect    // 声明这是一个AOP类
      @Component
      public class AuthInterceptor{@Resourceprivate UserService userService;@Around("@annotation(authCheck)")public Object doInterceptor(ProceedingJoinPoint joinPoint, AuthCheck authCheck) throws Throwable {String mustRole = authCheck.mustRole();RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();}}
      

相关文章:

JavaWeb - ⭐ AOP 面相切面编程原理及用户校验功能实战

一、概述 定义&#xff1a; AOP (Aspect Oriented Programming 面向切面编程) &#xff0c;一种面向方法编程的思想 功能&#xff1a;管理 bean 对象的过程中&#xff0c;通过底层的动态代理机制对特定方法进行功能的增强或改变 实现方式&#xff1a;动态代理技术&#xff0c…...

鸿道Intewell工业操作系统,三大关键技术,领跑行业前沿

鸿道工业操作系统&#xff0c;是软件定义控制的工业实时操作系统&#xff0c;具备三大关键技术&#xff1a; 1、确定性计算与高实时响应(微秒级、关键指标) 提供确定性的计算与高实时的系统环境&#xff0c;保障工业生产运作的灵活高效。 2、微内核、并发处理(微内核的强大…...

java 对ElasticSearch数据库操作封装工具类(对你是否适用嘞)

在 Java 中封装 ElasticSearch&#xff08;ES&#xff09;数据库操作&#xff08;ES版本之间变动挺大的&#xff0c;别轻易换版本&#xff09;&#xff0c;可以使得与 ES 的交互更加简洁和易于维护。通过封装常见的操作&#xff0c;如插入文档、查询、更新和删除等&#xff0c;…...

HarmonyOS NEXT 技术实践-基于基础视觉服务实现骨骼点识别

本示例展示了如何在HarmonyOS Next中实现基于基础视觉服务的骨骼点识别功能。骨骼点识别是计算机视觉中的一项重要技术&#xff0c;广泛应用于运动分析、健身监控和增强现实等领域。通过使用HarmonyOS Next提供的视觉API&#xff0c;开发者能够轻松地对人物图像进行骨骼点检测&…...

广州大学计算机组成原理课程设计

一.课设性质&#xff0c;目的&#xff0c;任务 《计算机组成与系统结构课程设计》是计算机学院各专业集中实践性环节之一&#xff0c;是学习完《计算机组成与系统结构》课程后进行的一次全面的综合练习。其目的是综合运用所学计算机原理知识&#xff0c;设计并实现一台模型计算…...

【漏洞复现】CVE-2021-45788 SQL Injection

漏洞信息 NVD - cve-2021-45788 Time-based SQL Injection vulnerabilities were found in Metersphere v1.15.4 via the “orders” parameter. Authenticated users can control the parameters in the “order by” statement, which causing SQL injection. API: /test…...

【Java基础面试题035】什么是Java泛型的上下界限定符?

回答重点 Java泛型的上下界限定符用于对泛型类型参数进行范围限制&#xff0c;主要有上界限定符和下届限定符。 1&#xff09;上界限定符 (? extends T)&#xff1a; 定义&#xff1a;通配符?的类型必须是T或者T的子类&#xff0c;保证集合元素一定是T或者T的子类作用&…...

无需GPU也能跑的修图神器(祛痣、去水印、去路人)

背景 在这个视觉内容创作盛行的时代&#xff0c;大家对图片质量要求愈发严苛。无论是日常分享的自拍照想祛痣变得完美无瑕&#xff0c;还是摄影作品需去水印彰显原创&#xff0c;亦或是旅游打卡照要去路人还原美景。如今&#xff0c;一款能在 CPU 上流畅运行的修改神器应运而生…...

R语言数据分析案例47-上海译文出版社旗舰店图书分析和可视化

一、研究背景 随着数字化时代的发展&#xff0c;图书出版行业面临着日益激烈的市场竞争。上海译文出版社作为一家知名的出版机构&#xff0c;其旗舰店的图书销售数据蕴含着丰富的信息。对最新入库图书进行深入分析和可视化呈现&#xff0c;有助于出版社更好地了解市场动态、读…...

牵手红娘:牵手App红娘助力“牵手”,脱单精准更便捷

随着互联网的普及&#xff0c;现代青年的社交圈层加速扩大&#xff0c;他们的恋爱观也正经历着前所未有的转变。在繁忙的工作之余&#xff0c;人们希望能够找到一种既高效又真诚的交友方式。于是&#xff0c;线上交友平台成为了他们寻找爱情的新选择。让不同文化背景、不同工作…...

什么是根服务器?有什么作用?

你知道什么是根服务器吗?在互联网的庞大架构中&#xff0c;根服务器很多人对它的了解并不深入。那么&#xff0c;根服务器到底是什么&#xff0c;它有什么作用呢? 什么是根服务器? 根服务器是互联网域名系统(DNS)的一部分&#xff0c;负责管理和维护最顶层的域名信息。简单…...

Tavily人工智能代理和检索增强生成应用设计的搜索引擎

Tavily人工智能代理和检索增强生成应用设计的搜索引擎 Tavily是一款专为人工智能代理和检索增强生成应用设计的搜索引擎.以下是其使用示例: 安装与配置 需先安装相应的包,并获取API密钥来设置环境变量. %pip install -qU "langchain-community>=0.2.11" tavi…...

web的五个Observer API

IntersectionObserver&#xff1a; 一个元素从不可见到可见&#xff0c;从可见到不可见 ??IntersectionObserver是一种浏览器提供的 JavaScript API&#xff0c;用于监测元素与视窗的交叉状态。它可以告诉开发者一个元素是否进入或离开视窗&#xff0c;以及两者的交叉区域的…...

CSS学习记录19

CSS文本效果 CSS text-overflow 属性规定应如何向用户呈现未显示的溢出的内容。 //裁剪 text-overflow: clip; //隐藏 text-overflow: ellipsis; CSS字换行&#xff08;Word Wrapping&#xff09; CSS word-wrap 属性使长文字能够被折断并换到下一行。 如果一个单词太长而…...

使用Amazon Bedrock的无服务器的智能工作流

使用Amazon Bedrock的无服务器的智能工作流 智能工作流基于用户输入处理不可预见的任务&#xff0c;比如发起API调用。无服务器架构可以高效地管理这些任务和不同的工作负载&#xff0c;而无需维护服务器&#xff0c;从而加快部署速度。 你将学习如何通过使用带有保护措施的智能…...

SDMTSP:粒子群优化算法PSO求解单仓库多旅行商问题,可以更改数据集和起点(MATLAB代码)

一、单仓库多旅行商问题 单仓库多旅行商问题&#xff08;Single-Depot Multiple Travelling Salesman Problem, SD-MTSP&#xff09;&#xff1a;&#x1d45a;个推销员从同一座中心城市出发&#xff0c;访问其中一定数量的城市并且每座城市只能被某一个推销员访问一次&#x…...

Java中的访问修饰符:分类、作用及应用场景

在Java编程中&#xff0c;访问修饰符&#xff08;Access Modifiers&#xff09;是控制类、方法、变量和构造函数访问权限的关键工具。通过合理使用访问修饰符&#xff0c;可以有效地封装代码&#xff0c;保护数据&#xff0c;并确保代码的安全性和可维护性。本文将详细介绍Java…...

【day16】Java开发常用API

模块15回顾 在深入探讨模块16之前&#xff0c;让我们回顾一下【day15】中的重点内容&#xff1a; String类&#xff1a; 构造方法&#xff1a;String(), String(String s), String(char[] chars), String(byte[] bytes), String(char[] chars, int offset, int count), String…...

LLaMA-Factory(二)界面解析

这里写目录标题 1. 基础选项语言模型选择模型路径微调方法检查点路径量化等级量化方法提示模板RoPE加速方式 2.模型训练界面训练方式数据集超参数设置其他参数部分参数设置LoRA参数设置RLHF参数设置GaLore参数设置BAdam参数设置训练 3.评估预测界面4.Chat界面5.导出Export界面 …...

(14)CT137A- 动态数码管设计

&#xff08;1&#xff09;了解板卡原理图中数码管的特性&#xff1a;共阳极数码管&#xff0c;公共端连接了电源&#xff0c;FPGA IO口低电平有效&#xff0c;另外&#xff0c;可以看到位选端FPGA位选低电平时选通。 &#xff08;2&#xff09;刷新时间的设定&#xff1a;众所…...

RT-DETR学习笔记(2)

七、IOU-aware query selection 下图是原始DETR。content query 是初始化为0的label embedding, position query 是通过nn.Embedding初始化的一个嵌入矩阵&#xff0c;这两部分没有任何的先验信息&#xff0c;导致DETR的收敛慢。 RT-DETR则提出要给这两部分&#xff08;conten…...

JS、JSX 和 TSX 的对比指南

JS、JSX 和 TSX 的对比指南 1. JavaScript (.js) 简介 JavaScript 是一种轻量级的、解释型的编程语言&#xff0c;是 Web 开发中最基础的语言之一。 优点 学习曲线较低&#xff0c;容易入门使用范围广泛&#xff0c;生态系统成熟灵活性高&#xff0c;支持多种编程范式不需…...

【STM32】RTT-Studio中HAL库开发教程十:EC800M-4G模块使用

文章目录 一、简介二、模块测试三、OneNet物联网配置四、完整代码五、测试验证 一、简介 EC800M4G是一款4G模块&#xff0c;本次实验主要是进行互联网的测试&#xff0c;模块测试&#xff0c;以及如何配置ONENET设备的相关参数&#xff0c;以及使用STM32F4来测试模块的数据上报…...

增加nginx配置文件(conf.d), 管理多个项目

1.切换到nginx目录下, 新建conf.d文件夹 mkdir conf.d 2.赋予conf.d权限 chmod 777 conf.d 3.进入conf.d, 编辑conf文件 vim zc_travel.conf server { listen 13101; server_name localhost;location / {root /home/baoxin/app/web/insight-radar-rcfx-pre/html_dev;index …...

服务器中了挖矿病毒-应急响应

事件&#xff1a;客户反映服务器响应很慢&#xff0c;出行卡顿&#xff0c;服务器操作系统为windows server 2008。 现场解决步骤&#xff1a; 1、打开任务管理器&#xff0c;看到一个javs.exe的程序&#xff0c;占用CPU使用率比较高&#xff0c;怀疑可能是木马。 2、右键打开…...

pid学习感悟

飞行控制PID算法——无人机飞控_飞控算法-CSDN博客 首先pid是对现测量值和目标值的差值&#xff0c;即偏差值的操作 p是线性操作&#xff0c;偏差越大&#xff0c;则对于控制单元操作的值越大 d是微分操作&#xff0c;我们知道微分其实就是数值变化的斜率&#xff0c;所以当偏…...

Centos7.9安装openldap+phpldapadmin+grafana配置LDAP登录最详细步骤 亲测100%能行

一、部署LDAP 1、安装LDAP yum install -y openldap-servers openldap-clients openldap openldap-devel compat-openldap openldap-servers-sql systemctl start slapd systemctl enable slapd2、创建第一个管理账号密码&#xff08;设置为ldapadmin&#xff09; slappass…...

唯品会C++面试题及参考答案

内存池怎么可以保证不会产生碎片? 内存池通过预先分配一块较大的内存区域,然后对这块内存进行管理,来减少碎片产生。 首先,内存池采用固定大小的内存块分配策略。比如,将内存池划分成大小相同的小块,当有内存分配请求时,就从这些固定大小的块中选取合适的进行分配。这种…...

Flask中@app.route()的methods参数详解

诸神缄默不语-个人CSDN博文目录 在 Flask 中&#xff0c;app.route 是用于定义路由的核心装饰器&#xff0c;开发者可以通过它为应用指定 URL 映射及相应的处理函数。在处理 HTTP 请求时&#xff0c;不同的业务场景需要支持不同的 HTTP 方法&#xff0c;而 app.route 的 metho…...

使用Grafana中按钮插件实现收发HTTP请求

最近项目中需要监控分布式集群的各项指标信息&#xff0c;需要用到PrometheusGrafana的技术栈实现对分布式集群的各个节点状态进行可视化显示&#xff0c;但是要求前端需要提供一个易用的接口让用户可以触发一些操作&#xff0c;例如负载高时进行负载均衡或弹性伸缩。网上找到的…...

workman服务端开发模式-应用开发-vue-element-admin挂载websocket

一、项目根目录main.js添加全局引入 import /utils/websocket 二、在根目录app.vue 中初始化WebSocket连接 <template><div id"app"><router-view /></div> </template><script>import store from ./store export default {n…...

堆排序【东北大学oj数据结构9-4】C++

堆排序是一种基于堆的数据结构的排序&#xff0c;是一种快速排序算法&#xff0c;可以在输入数组中实现排序处理&#xff08;内存高效&#xff09;。 堆排序可以实现如下&#xff1a; maxHeapify(A, i) l left(i) r right(i) // select the node which has the m…...

Linux RTC 驱动框架

目录 一、实时时钟&#xff08;RTC&#xff09;介绍1.1 概述1.2 功能1.3 应用场景1.4 工作原理1.5 对外接口1.6 常见 RTC 芯片1.7 在 Linux 系统中的应用1.8 注意事项 二、Linux 内核 RTC 驱动框架2.1 相关源码文件介绍2.2 核心数据结构2.2.1 struct rtc_device2.2.2 rtc_class…...

智能订餐:基于JSP的管理系统设计与优化

相关技术介绍 2.1 B/S结构 目前使用较多的开发结构模式大致可以包括C/S模式和B/S模式[5]。其中&#xff0c;C/S模式全称为客户端/服务器模式&#xff08;Client/Server模式&#xff09;&#xff0c;B/S模式全称为浏览器/服务器模式&#xff08;Browser/Server模式&#xff09;。…...

Java基本查询(四)

JPA 查询All示例 JPA教程 - JPA查询All示例 我们可以在JPQL中使用带有子查询的ALL运算符。 List l em.createQuery("SELECT e FROM Professor e WHERE e.salary < " "ALL (SELECT d.salary FROM e.directs d)").getResultList();例子 下面的代码来自…...

【双指针算法】--复写零

文章目录 1. 题目2. 题目解析3. 代码 1. 题目 在线oj 给你一个长度固定的整数数组 arr &#xff0c;请你将该数组中出现的每个零都复写一遍&#xff0c;并将其余的元素向右平移。 注意&#xff1a;请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改&a…...

leetcode hot100 两两交换链表之中的节点

24. 两两交换链表中的节点 已解答 中等 相关标签 相关企业 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09; # Definition fo…...

Yolo11改进策略:主干网络改进|FastVit与Yolo11完美融合,重参数重构Yolo11网络(全网首发)

文章目录 摘要FastViT:一种使用结构重新参数化的快速混合视觉变换器1、简介2、相关工作3、体系结构3.1、概述3.2、FastViT3.2.1、重新参数化跳过连接3.2.2、线性训练时间过参数化3.2.3、大核卷积4、实验4.1、图像分类4.2、鲁棒性评价4.3、3D Hand网格估计4.4、语义分割和目标检…...

vscode打开下一个文件的时候上一个文件会关闭

解决方法&#xff1a; 你可以通过设置 workbench.editor.enablePreview 来控制在 VS Code 中打开文件时是否会关闭上一个文件。将其设置为 false 可以防止这种行为。 {"workbench.editor.enablePreview": false } 在设置编辑器中显示 "workbench.editor.enab…...

windows使用zip包安装MySQL

windows通过zip包安装MySQL windows通过zip包安装MySQL下载MySQL的zip安装包创建安装目录和数据目录解压zip安装包创建配置目录 etc 和 配置文件 my.ini安装MySQL进入解压后的bin目录执行命令初始化执行命令安装 验证安装查看服务已安装 启动MySQL查看服务运行情况修改密码创建…...

【LeetCode每日一题】——415.字符串相加

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时空频度】九【代码实现】十【提交结果】 一【题目类别】 字符串 二【题目难度】 简单 三【题目编号】 415.字符串相加 四【题目描述】 给定两个字符…...

基于角色的访问控制(RBAC)在异构系统中的应用

在数字化蓬勃发展的当下&#xff0c;企业运营高度依赖各类异构系统。基于角色的访问控制&#xff08;RBAC&#xff09;成为管理这些系统中用户权限的核心策略。RBAC 依据组织内的岗位、职责定义角色&#xff0c;按角色分配权限&#xff0c;用户凭借所属角色获取相应访问权&…...

FPGA实现MIPI转FPD-Link车载同轴视频传输方案,基于IMX327+FPD953架构,提供工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐本博主所有FPGA工程项目-->汇总目录我这里已有的 MIPI 编解码方案 3、本 MIPI CSI-RX IP 介绍4、详细设计方案设计原理框图IMX327 及其配置FPD-Link视频串化-解串方案MIPI CSI RX图像 ISP 处理图像缓存HDMI输出工程源码架构 5、…...

远程控制macOS一直卡在100%,能连接上了却只显示了壁纸?

前言 前段时间有个朋友过来咨询关于Windows使用第三方远程软件&#xff08;向日葵、Todesk等&#xff09;远程连接控制macOS系统&#xff0c;但出现了一些奇奇怪怪的问题。 比如在连接的时候&#xff0c;一直卡在100%连接&#xff0c;对方的电脑却已经显示已经被控制的状态。…...

springboot中使用gdal将表中的空间数据转shapefile文件

springboot中使用gdal将表中的空间数据转shapefile文件 代码&#xff1a; // 样本导出-将样本表导出为shapefile&#xff0c;复制样本shp文件到临时目录下 sampleDir是文件夹pathpublic void setYbShapeFile(Yb yb, File sampleDir) {// 创建 前时项 和 后时项 文件夹File y…...

捋一捋相关性运算,以及DTD和NLP中的应用

捋一捋相关性运算&#xff0c;以及DTD和NLP中的应用 相关性和相干性,有木有傻傻分不清相关性数字信号的相关运算同维度信号的相关理解 相关--互相关--相干 回声消除过程如何套用这些知识相关性/相干性检测在DT中的应用参考 相关性和相干性,有木有傻傻分不清 这是容易混淆的两个…...

Calcite Web 项目常见问题解决方案

Calcite Web 项目常见问题解决方案 calcite-web Authoritative front-end development resources for Calcite design initiative. Includes extendable base components and styles, as well as a modular and efficient framework for ArcGIS properties. [这里是图片001] 项…...

3090. 每个字符最多出现两次的最长子字符串

题目内容&#xff1a; 给你一个字符串 s &#xff0c;请找出满足每个字符最多出现两次的最长子字符串&#xff0c;并返回该 子字符串 的 最大 长度。 示例 1&#xff1a; 输入&#xff1a; s "bcbbbcba" 输出&#xff1a; 4 解释&#xff1a; 以下子字符串长…...

基于微信小程序的短视频系统(SpringBoot)+文档

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…...

Git的简介

文章目录 一.Git是什么二.核心概念三.工作流程四.Git的优势 下载Git 推荐官网下载 官网地址 一.Git是什么 Git是一个分布式版本控制系统&#xff0c;用于跟踪文件的变化并协调多人对同一项目的开发工作。它就像是一个时光机器&#xff0c;能够记录文件在不同时间点的状态&…...