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

Java阶段三05

第3章-第5节

一、知识点

动态代理、jdk动态代理、cglib动态代理、AOP、SpringAOP

二、目标

  • 理解什么是动态代理和它的作用

  • 学会使用JAVA进行动态代理

  • 理解什么是AOP

  • 学会使用AOP

  • 理解什么是AOP的切入点

三、内容分析

  • 重点

    • 理解什么是动态代理和它的作用

    • 理解什么是AOP

    • 学会使用AOP

  • 难点

    • 理解什么是AOP

    • 学会使用AOP

四、内容

1、动态代理

1.1 什么是代理

代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式,即通过代理对象访问目标对象。这样做可以在目标对象实现的基础上,增强额外的功能操作,扩展目标对象的功能

开发系统的时候,第一个版本的系统比较简陋,只需要实现基本功能,程序使用了一段时间后,准备二开,在二开的项目需求中需要对第一个版本的所有操作都做一个日志的记录,以便于后续的系统维护和分析,这个时候就可以用上代理了

1.2 什么是动态代理
  • 特点:字节码随用随创建,随用随加

  • 作用:不修改源码,对方法增强,在不改变原有代码的情况下,对方法进行增强

  • 在程序运行的时候动态生成代理类进行增强操作

2、动态代理的使用

2.1 使用JDK实现动态代理
  • 新建动态代理类,实现InvocationHandler接口
    public class Proxy1 implements InvocationHandler {private Object obj = new Object();@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 要执行的方法,传入一个对象,所以需要创建一个对象method.invoke(obj);return null;}
    }

  • 使用Proxy类中的newProxyIntance方法,并且被代理类至少实现一个接口,否则不能用
    • 三个参数
      • ClassLoader 类加载器,用于加载代理对象类,和被代理对象使用相同的加载器,固定写法
      • Class[] 被代理对象实现的所有接口的字节码数组,用于代理的接口,固定写法
      • InvocationHandler 动态代理方法在执行时,会调用里面的invoke方法去执行
    public class Proxy1 implements InvocationHandler {private Object obj = new Object();// 实现一个方法,方法名可以自己定// 传入要调用的对象去调用// 调用这个方法,传入要增强的对象public Object newProxyInstance(Object obj) {// 把传进来的对象赋值给成员变量,给invoke使用this.obj = obj;// 使用Proxy类中的newProxyIntance方法return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);}
      @Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 要执行的方法,传入一个对象,所以需要创建一个对象method.invoke(obj);return null;}
    }
  • 创建接口并实现

    public interface StudentService {void queryAll();
    }

  • 调用

    Proxy1 proxy1 = new Proxy1();
    StudentServiceImpl service = new StudentServiceImpl();
    // 会调用newProxyInstance返回一个新对象
    StudentService service1 = (StudentService) proxy1.newProxyInstance(service);
    service1.queryAll();

  • 重写invoke方法

    调用的时候会先执行newProxyInstance方法,返回一个新的对象

    调用方法的时候会执行invoke方法,在invoke方法中执行我们调用的方法,所以可以在invoke中编写我们的增强操作

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {long start = System.currentTimeMillis();method.invoke(obj);// args可以传递参数// 获取参数// int id = (int)args[0];// method.invoke(obj, args);long end = System.currentTimeMillis();System.out.println(end - start);return null;
    }

2.2 使用cglib实现动态代理

增强的类不需要实现接口

  • 引入包cglib

    <!-- https://mvnrepository.com/artifact/cglib/cglib -->
    <dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.3.0</version>
    </dependency>

  • 封装代理类

    public class Proxy02 implements MethodInterceptor {private Object obj = new Object();// 调用这个方法,传入要增强的对象public Object newProxyInstance(Object obj) {this.obj = obj;// 字节码增强器,用来为无接口的类创建代理Enhancer enhancer = new Enhancer();// 设置要继承的类enhancer.setSuperclass(obj.getClass());// 动态代理方法在执行时,会调用里面的invoke方法去执行enhancer.setCallback(this);// 创建代理return enhancer.create();}@Overridepublic xxx {long start = System.currentTimeMillis();method.invoke(obj, objects);long end = System.currentTimeMillis();System.out.println(end - start);return null;}
    }

JDK实现动态代理的底层原理是基于反射,创建出来的代理对象和目标对象是兄弟关系

cglib实现动态代理的底层原理是基于继承,创建出来的代理对象和目标对象是父子关系

3、AOP

3.1 什么是AOP

AOP(Aspect Oriented Programming:面向切面编程),在不修改源代码的情况下,给程序动态统一添加功能的一种技术

作用:利用AOP对业务逻辑的各个部分进行隔离,降低业务逻辑的耦合性,提高程序的可重用型和开发效率。

优势:减少重复代码,提高开发效率,维护方便

实现方式:使用动态代理技术

基于动态代理技术来实现功能,将功能功能提取出来,如下图,原本要写四个接口那么验证参数、日志都得在代码中写好,然后再去实现业务代码,比较繁琐,使用切面以后将验证参数、日志等功能提取出来,四个接口我们只需要通过配置就可以直接调用对应的功能,让我们能够直接专注于写业务代码

 

3.2 AOP相关术语
  • 目标对象(Target)

    目标对象指将要被增强的对象,即包含主业务逻辑的类对象。或者说是被一个或者多个切面所通知的对象

  • 织入(Weaving)

    织入是将切面和业务逻辑对象连接起来, 并创建通知代理的过程。织入可以在编译时,类加载时和运行时完成,就是指将切面代码插入到目标对象的过程

  • 切面(Aspect)

    切面是一个横切关注点的模块化,一个切面能够包含同一个类型的不同增强方法,比如说事务处理和日志处理可以理解为两个切面。切面由切入点和通知组成,它既包含了横切逻辑的定义,也包括了切入点的定义。 Spring AOP就是负责实施切面的框架,它将切面所定义的横切逻辑织入到切面所指定的连接点中。

  • 通知(Advice)

    通知是指拦截到连接点之后要执行的代码,包括了“around”、“before”和“after”等不同类型的通知。Spring AOP框架以拦截器来实现通知模型,并维护一个以连接点为中心的拦截器链。

  • 切入点(PointCut)

    切入点是对连接点进行拦截的条件定义。切入点表达式如何和连接点匹配是AOP的核心,Spring缺省使用AspectJ切入点语法。 一般认为,所有的方法都可以认为是连接点,但是我们并不希望在所有的方法上都添加通知,而切入点的作用就是提供一组规则(使用 AspectJ pointcut expression language 来描述) 来匹配连接点,给满足规则的连接点添加通知。可以理解为就是指切面具体织入的方法。

  • 连接点(JoinPoint)

    连接点(JoinPoint)指可以被切面织入的方法,如方法的调用或特定的异常被抛出。简单来说,连接点就是被拦截到的程序执行点,因为Spring只支持方法类型的连接点,所以在Spring中连接点就是被拦截到的方法

3.3 AOP的使用
3.3.1 引入spring依赖
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.1.11.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.6</version>
</dependency>
3.3.2 使用xml配置实现
  • 把Bean交给spring容器管理
    <bean id="logService" class="com.company.service.LogService"></bean>

  • 使用aop:config标签表明开始AOP的配置
    <aop:config></aop:config>

  • 使用aop:aspect标签配置切面

    id属性:给切面提供一个唯一标识

    ref属性:指定通知(切面)类的Bean的id

    <aop:config><aop:aspect id="logAdvice" ref="logService">
    ​</aop:aspect>
    </aop:config>

  • 在aop:aspect内部使用对应标签配置通知的类型
    <aop:config><aop:aspect id="logAdvice" ref="logService"><aop:before><!-- 前置 --></aop:aspect>
    </aop:config>

  • 切入点配置

    method属性:用于指定logService类中哪个方法是前置通知

    pointcut属性:切入点,指定切面具体织入的方法

    <aop:config><aop:aspect id="logAdvice" ref="logService"><aop:before method="before" pointcut="execution(* *..*.*(..))"><!-- 前置 --></aop:aspect>
    </aop:config>
    • aop:before 前置通知
    • aop:after 后置通知,有异常也会执行
    • aop:after-returning 后置通知,有异常不执行
    • aop:after-throwing 切入内容抛出异常后处理异常的逻辑
      <!-- XML要配置个throwing-->
      <aop:after-throwing method="test5" throwing="e" pointcut="execution(* *..UserService.*(..))"></aop:after-throwing>
      // e这个变量名要和xml配置的throwing的值一致
      public void test5(JoinPoint point, Exception e) throws Throwable {System.out.println("test5");System.out.println(e.getMessage());
      }

    • aop:around 环绕通知
      // around 需要做特殊配置
      public void test4(ProceedingJoinPoint point) throws Throwable {System.out.println("test4");point.proceed();System.out.println("test4结束");
      }

  • 配置表达式

    pointcut属性:用于指定切入点表达式,该表达式指的是对业务层中哪些方法提供增强配置表达式

    表达式写法:访问修饰符 返回值 包名.类名.方法名(参数列表)

    • 标准的表达式写法

      public void 包名.类名.方法名()

    • 访问修饰符可以省略

      void 包名.类名.方法名()

    • 返回值可以使用通配符,表示任意返回

      * 包名.类名.方法名()

    • 包名可以使用通配符,表示任意包,但是有几级包,就得写几个*

      * *.*.*.类名.方法名()

    • 包名可以使用*..表示当前包及其子包

      * *..类名.方法名()

    • 类名和方法名都可以使用通配符

      * *..*.*()

    • 参数列表
      可以直接写数据类型
      基本数据类型直接写名称 如int
      引用数据类型写包名.类名的方式 java.lang.String
      可以使用通配符表示任意类型,但是必须有参数
      可以使用..表示有无参数均可,有参数可以是任意类型
    全通配写法:

    * *..*.*(..)

    实际开发中切入点表达式的通常写法

    * 包名.*.*(..)

    <aop:config><aop:aspect id="logAdvice" ref="logService"><aop:before method="before" pointcut="execution(* *..*.*(..))"></aop:before></aop:aspect>
    </aop:config>

  • 提取表达式

    多个地方使用同一个表达式的时候可以提取表达式

    // 单独配置切入点
    <aop:config><aop:pointcut id="logPointcut" expression="execution(* *..*.*(..))"/><aop:aspect id="logAdvice" ref="logService"><aop:before method="before" pointcut-ref="logPointcut"></aop:before></aop:aspect>
    </aop:config>

3.3.3 使用注解实现
  • 创建配置类
    @Configuration
    @ComponentScan("com.cpmpany.aop")
    @EnableAspectJAutoProxy // 开启注解的方式实现AOP
    public class SpringConfig {}

  • 创建切面类 使用 @Aspect创建切面类 @Order(int) 控制切面类的顺序
    @Component
    @Aspect
    @Order(1)
    public class Strong {}

  • 配置注解、关键字 excution (表达式)
    // 要增强的逻辑
    // 第一个表示返回值,*匹配所有的返回值
    // 第二个表示要增强到哪个方法上
    @Before("execution(* com.cpmpany.aop.UserService.queryAll())")
    public void start() {System.out.println("开始");
    }
    @After("execution(* com.cpmpany.aop.UserService.queryAll())")
    public void end() {System.out.println("结束");
    }

  • 测试类
    public class TestAop01 {public static void main(String[] args) {ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);UserService service = ctx.getBean(UserService.class);service.queryAll();}
    }

4、小结

本章节中我们学了什么是动态代理、动态代理的作用、JAVA如何实现动态代理、理解了什么是SpringAOP以及SpringAOP的使用方式,帮助我们去掌握Spring的知识点,至此,我们的Spring相关的知识点就以及学习完毕了,希望大家可以自己多多动手去学习。

下一节中,我们将会开始SSM的第二个部分SpringMVC的使用,学习什么是SpringMVC,学会如何使用SpringMVC写一个网页接口。

相关文章:

Java阶段三05

第3章-第5节 一、知识点 动态代理、jdk动态代理、cglib动态代理、AOP、SpringAOP 二、目标 理解什么是动态代理和它的作用 学会使用JAVA进行动态代理 理解什么是AOP 学会使用AOP 理解什么是AOP的切入点 三、内容分析 重点 理解什么是动态代理和它的作用 理解什么是AO…...

【论文复现】LeNet-5

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ LeNet-5 概述LeNet-5网络架构介绍使用 LeNet-5 网络结构创建 MNIST 手写数字识别分类器下载并加载数据&#xff0c;并对数据进行预处理搭建 …...

Python-链表数据结构学习(1)

一、什么是链表数据&#xff1f; 链表是一种通过指针串联在一起的数据结构&#xff0c;每个节点由2部分组成&#xff0c;一个是数据域&#xff0c;一个是指针域&#xff08;存放下一个节点的指针&#xff09;。最后一个节点的指针域指向null&#xff08;空指针的意思&#xff0…...

nginx安装和负载均衡

1. nginx安装 &#xff08;1&#xff09;安装依赖项&#xff1a; yum -y install gcc gcc-c make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel&#xff08;2&#xff09;下载Nginx源代码&#xff1a; http://nginx.org/en/download.html https://nginx.o…...

Buffered 和 BuffWrite

Buffered和BuffWrite是Java IO包中的两个类&#xff0c;用于提高IO操作的效率。 Buffered是一个缓冲区类&#xff0c;可以将一个InputStream或者一个Reader包装起来&#xff0c;提供了一定的缓冲区大小&#xff0c;可以一次读取多个字节或字符&#xff0c;减少了读取的次数&am…...

第三十八篇——高斯分布:大概率事件意味着什么?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 通过高斯分布的公式&#xff0c;我们可以从科学的角度知道很多和我们的直…...

Ubuntu24.04初始化教程(包含基础优化、ros2)

目录 构建系统建立系统备份**Timeshift: 系统快照和备份工具****安装 Timeshift****使用 Timeshift 创建快照****还原快照****自动创建快照** 最基本配置换源 软件配置打开新世界大门 谷歌浏览器星火应用商城更换输入法安装vscode 完全删除snap删除**删除软件****彻底删除**禁止…...

C/C++ 数据结构与算法 【时间复杂度和空间复杂度】【日常学习,考研必备】

一、时间复杂度 定义&#xff1a;时间复杂度描述了算法运行时间随输入大小增长而增长的趋势。它主要关注的是算法中最耗时的部分&#xff0c;并忽略常数因子、低阶项等细节。表示方法&#xff1a;通常使用大O符号&#xff08;Big O notation&#xff09;来表示时间复杂度。例如…...

brew安装mongodb和php-mongodb扩展新手教程

1、首先保证macos下成功安装了Homebrew&#xff0c; 在终端输入如下命令&#xff1a; brew search mongodb 搜索是不是有mongodb资源&#xff0c; 演示效果如下&#xff1a; 2、下面来介绍Brew 安装 MongoDB&#xff0c;代码如下&#xff1a; brew tap mongodb/brew brew in…...

使用zabbix监控k8s

一、 参考文献 小阿轩yx-案例&#xff1a;Zabbix监控kubernetes云原生环境 手把手教你实现zabbix对Kubernetes的监控 二、部署经验 关于zabbix监控k8s&#xff0c;总体来说是分为两块内容&#xff0c;一是在k8s集群部署zabbix-agent和zabbix- proxy。二是在zabbix进行配置。…...

Brain.js(二):项目集成方式详解——npm、cdn、下载、源码构建

Brain.js 是一个强大且易用的 JavaScript 神经网络库&#xff0c;适用于前端和 Node.js 环境&#xff0c;帮助开发者轻松实现机器学习功能。 在前文Brain.js&#xff08;一&#xff09;&#xff1a;可以在浏览器运行的、默认GPU加速的神经网络库概要介绍-发展历程和使用场景中&…...

SQL Server管理员sa登录失败原因

文章目录 一、开启混合登录模式二、启用sa三、更改密码四、登录sa一、开启混合登录模式 用Windows身份登录数据库服务。 在连接名上右键→属性。 在安全性选项卡下,选择【SQL Server和Windows身份验证模式】,点击【确定】,提示需要重启服务。 Win+R,输入指令:services.ms…...

怎么样才算得上熟悉高并发编程?

提到并发编程很多人就会头疼了&#xff1b;首先就是一些基础概念&#xff1a;并发&#xff0c;并行&#xff0c;同步&#xff0c;异步&#xff0c;临界区&#xff0c;阻塞&#xff0c;非阻塞还有各种锁全都砸你脸上&#xff0c;随之而来的就是要保证程序运行时关键数据在多线程…...

conan2包管理菜鸟入门之------------------交叉编译和静态编译

在做嵌入式开发时,我们经常需要交叉编译,conan2可以通过新增profile,在profile配置交叉编译工具链,然后在conan build指定profile就可以进行交叉编译,具体步骤如下: 1.首先在profiles下新增目标平台配置,默认情况下是只有default,下面是一个example profile文件: [set…...

Go-MediatR:Go语言中的中介者模式

在Go语言中&#xff0c;确实存在一个与C#中的MediatR类似的组件包&#xff0c;名为Go-MediatR。 Go-MediatR是一个受.NET中MediatR库启发的Go语言实现&#xff0c;它专注于通过中介者模式简化命令查询责任分离&#xff08;CQRS&#xff09;模式的处理和在事件驱动架构中的应用…...

双向链表

目录 链表的分类 概念 双向链表的实现 ① 结构 ② 初始化 ③ 打印 ④ 插入数据 ⑤ 删除数据 ⑥ 查找数据 ⑦ 在pos位置之前插入数据 ⑧ 删除pos位置的数据 ⑨ 销毁链表 总结 链表的分类 虽然有这么多的链表的结构&#xff0c;但是我们实际中最常⽤还是两种结构&…...

Spring Boot使用JDK 21虚拟线程

JDK 21引入的虚拟线程&#xff08;Virtual Threads&#xff09;是 Project Loom 的一部分&#xff0c;旨在显著简化并发编程并提高 Java 应用的可扩展性。以下是虚拟线程的主要特点&#xff1a; 1. 概念 虚拟线程是轻量级线程&#xff0c;与传统的操作系统线程不同&#xff0…...

24/11/29 Vite

安装nodejs 直接下一步 node.js中自带NPM包(管理js库文件)管理工具 测试NPM命令 npm -v 检查版本 npm config set registry https://registry.npmmirror.com 设置远程仓库 2.安装vite vite是前端服务的工具集 vue团队主持开发 Vite 官网 使用vite安装命令 这个命令是安…...

黑马2024AI+JavaWeb开发入门Day04-SpringBootWeb入门-HTTP协议-分层解耦-IOCDI飞书作业

视频地址&#xff1a;哔哩哔哩 讲义作业飞书地址&#xff1a;day04作业&#xff08;IOC&DI&#xff09; 作业很简单&#xff0c;主要是练习拆分为三层架构controller、service、dao&#xff0c;并基于IOC & DI进行解耦。 1、结构&#xff1a; 2、代码 网盘链接&…...

[Unity] Inputfield光标移动到最后(不选中内容)

经过测试&#xff0c;要用Inputfield实现光标末尾显示但不选中内容非常麻烦&#xff0c;要么会选中全部&#xff0c;要么采用下面这种延迟显示&#xff0c;但会有明显的变化中间过程&#xff1a; protected override void OnPanelEnter() {// 先激活输入框&#xff08;这里的I…...

实践五 网络安全防范技术

1 实践内容 1.1 安全防范 为了保障"信息安全金三角"的CIA属性、即机密性、完整性、可用性&#xff0c;信息安全领域提出了一系列安全模型。其中动态可适应网络安全模型基于闭环控制理论&#xff0c;典型的有PDR和P^2DR模型。 1.1.1 PDR模型 信息系统的防御机制能抵抗…...

Spring Web开发注解和请求(1)

大家好我是小帅&#xff0c;今天我们来学习Spring Web MVC框架&#xff08;入门级&#xff09; 文章目录 1. 什么是 Spring Web MVC&#xff1f;1.1 MVC 定义1.2 什么是Spring MVC ? 2. 学习Spring MVC2.1 建⽴连接第一个spring MVC程序 3. web开发注解的解释3.1RestControlle…...

设计模式-适配器模式-注册器模式

设计模式-适配器模式-注册器模式 适配器模式 如果开发一个搜索中台&#xff0c;需要适配或接入不同的数据源&#xff0c;可能提供的方法参数和平台调用的方法参数不一致&#xff0c;可以使用适配器模式 适配器模式通过封装对象将复杂的转换过程隐藏于幕后。 被封装的对象甚至…...

保持角色一致性!flux新模型redux用法(含模型与工作流)

​ 目录 redux模型是什么&#xff0c;能干啥&#xff1f; 用到的工具有哪些&#xff1f; 工具和模型文件在哪里下载&#xff1f; 整合包&#xff1a; 下载后需要分别放到指定目录&#xff1a; redux模型怎么用&#xff1f; 加载工作流 上传图片和输入提示词 生成结果…...

点云3DHarris角点检测算法推导

先回顾2D的Harris角点检测算法推导 自相关矩阵是Harris角点检测算法的核心之一&#xff0c;它通过计算图像局部区域的梯度信息来描述该区域的特征。在推导Harris角点检测算法中的自相关矩阵时&#xff0c;我们首先需要了解自相关矩阵的基本思想和数学背景。 参考 1. 能量函数…...

ASUS/华硕天选5Pro酷睿版 FX607J 原厂Win11 22H2系统 工厂文件 带ASUS Recovery恢复

华硕工厂文件恢复系统 &#xff0c;安装结束后带隐藏分区&#xff0c;一键恢复&#xff0c;以及机器所有驱动软件。 系统版本&#xff1a;windows11 原厂系统下载网址&#xff1a;http://www.bioxt.cn 需准备一个20G以上u盘进行恢复 请注意&#xff1a;仅支持以上型号专用…...

CentOS修改yum.repos.d源,避免“Could not resolve host: mirrorlist.centos.org”错误

1、问题现象 由于CentOS停止维护&#xff0c;mirrorlist.centos.org网站也关闭不可访问。导致CentOS默认配置的yum.repos.d源也不可用&#xff0c;所以执行yum命令会报“Could not resolve host: mirrorlist.centos.org”错误。具体如下&#xff1a; Could not retrieve mirror…...

rest-assured multiPart上传中文名称文件,文件名乱码

rest-assured是一个基于java语言的REST API测试框架&#xff0c;在使用rest-assured的multipart 上传文件后&#xff0c;后端获取的文件名称乱码。截图如下&#xff1a; 原因是rest-assured multipart/form-data默认的编码格式是US-ASCII&#xff0c;需要设置为UTF-8。 Befo…...

Springfox迁移到 Springdoc OpenAPI 3

将项目从 Springfox 迁移到 Springdoc OpenAPI 3 时&#xff0c;主要的工作是将原先使用的 Springfox 注解替换为 Springdoc OpenAPI 3 中的对应注解。虽然 Springdoc OpenAPI 3 基于 OpenAPI 3 规范&#xff0c;并且有一些不同的命名方式和设计理念&#xff0c;但大部分注解的…...

基于Java Springboot考研论坛系统

一、作品包含 源码数据库全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据库&#xff1a;…...

性别需不需要加索引?

1. 什么是索引&#xff1f; 索引就像一本书的目录&#xff0c;能够帮助数据库快速定位到特定的数据&#xff0c;减少扫描的工作量。使用索引的前提是能够有效缩小查询范围&#xff0c;否则索引的存在可能并不带来性能提升。 使用索引有额外的开销&#xff1a; 索引需要额外的…...

Subprocess 和 Multiprocessing 的区别与使用要点及进程关闭方法

Subprocess 和 Multiprocessing 的区别与使用要点及进程关闭方法 最近在使用这两个库比较多&#xff0c;所以就借此机会记录一下这两个库的使用方式 一、Subprocess 和 Multiprocessing 的区别 1. 功能目标不同 Subprocess&#xff1a;主要用于在 Python 程序中启动外部程序…...

美国网络安全态势感知(4):威胁情报发展现状

美国政府依托其不断发展完善的威胁情报共享技术&#xff0c;构建了名为“网络天气地图”的威胁情报管理体系&#xff0c;如下图所示&#xff1a; “网络天气地图”的威胁情报管理体系运行过程以及每个过程中的关键信息如下所述&#xff1a; 通过国家网络安全保护系统与互联网中…...

【VRChat 改模】开发环境搭建:VCC、VRChat SDK、Unity 等环境配置

一、配置 Unity 相关 1.下载 UnityHub 下载地址&#xff1a;https://unity.com/download 安装打开后如图所示&#xff1a; 2.下载 VRChat 官方推荐版本的 Unity 跳转界面&#xff08;VRChat 官方推荐页面&#xff09;&#xff1a;https://creators.vrchat.com/sdk/upgrade/…...

android将pcm byte[]通过Librtmp进行rtmp推流

需求 我们这边做的功能是智能戒指&#xff0c;戒指可以录音&#xff0c;然后app通过蓝牙连接&#xff0c;将音频的byte[]进行rtmp推流 技术 因为我们不涉及直播&#xff0c;也不涉及视频&#xff0c;工期也比较短&#xff0c;只是音频推流&#xff0c;所以没用更复杂的ffmpe…...

宠物领养技术:SpringBoot框架应用

摘 要 如今社会上各行各业&#xff0c;都在用属于自己专用的软件来进行工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。互联网的发展&#xff0c;离不开一些新的技术&#xff0c;而新技术的产生往往是为了解决现有问题而产生的。针对于宠物领养…...

【前端】跨域问题与缓存

报错如下&#xff1a; 原因&#xff1a; 浏览器 缓存跨域&#xff0c;顾名思义是由于浏览器的缓存机制导致的一种跨域情况。这种跨域一般会出现在浏览器通过一些无视跨域的标签和css(如img、background-image)缓存了一些图片资源之后&#xff0c;当再次发起图片请求时&#xff…...

DepthAI 2.29版本 发布

2024年11月29日 增加在设备运行时使用新的 dai::Device.setCalibration() 更改设备校准能力的方法&#xff0c;并使用 dai::Device.getCalibration() 进行检索校准 1&#x1f343; 新的立体深度预设属性&#xff1a; 预设 面部 高细节 机器人 2&#x1f343; 多项摄像…...

C7.5【x86汇编】底层分析范围for的执行过程

目录 1.反汇编代码 2.分析 1.栈区初始化 2.设置数组元素的值 3. 逐条分析范围for 1.arr的地址被放到[ebp-2Ch]处 2.[ebp-2Ch]指向的值被复制一份到[ebp-30h]处 3.eax暂存[ebp-2Ch]指向的值,加28h后存储到[ebp-34h]处 4.跳转指令 5.比较[ebp-30h]和[ebp-34h]指向的值,…...

你听说过MIPS吗?它和ARM有何区别?

探索MX2000-B BGA核心版为何选用MIPS指令集的君正X2000处理器&#xff0c;MIPS相较于ARM有哪方面优势&#xff1f; 前段时间ZLG致远电子推出了MX2000-B BGA核心版&#xff0c;这款产品的核心芯片搭载了基于MIPS指令集的君正X2000处理器。有些工程师对于MIPS不怎么了解&#xff…...

SQL面试50题 数据库准备(存储过程)

数据表关系图 数据表 CREATE TABLE student (id int(11) NOT NULL AUTO_INCREMENT,name varchar(255) NOT NULL,sex enum(female,male) NOT NULL,birth date NOT NULL,credit float(5,2) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT25 DEFAULT CHARSETutf8;…...

Github 基本使用学习笔记

1. 基本概念 1.1 一些名词 Repository&#xff08;仓库&#xff09; 用来存放代码&#xff0c;每个项目都有一个独立的仓库。 Star&#xff08;收藏&#xff09; 收藏你喜欢的项目&#xff0c;方便以后查看。 Fork&#xff08;克隆复制项目&#xff09; 复制别人的仓库&…...

react + vite 中的环境变量怎么获取

一、Vite 环境变量基础 创建一个.env文件&#xff0c;Vite 定义的环境变量需要以VITE_开头。 VITE_API_URL "http://localhost:3000/api" 生产模式创建.env.production。 VITE_API_URL "https://production-api-url.com/api" 二、在 React 组件中获…...

leetcode hot100【 LeetCode 54.螺旋矩阵】java实现

LeetCode 54.螺旋矩阵 题目描述 给定一个 m x n 的矩阵&#xff0c;返回其元素按照螺旋顺序的数组。 示例 1: 输入: [[ 1, 2, 3 ],[ 4, 5, 6 ],[ 7, 8, 9 ] ]输出: [1, 2, 3, 6, 9, 8, 7, 4, 5]示例 2: 输入: [[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12] ]输出: [1, …...

Axios与FastAPI结合:构建并请求用户增删改查接口

在现代Web开发中&#xff0c;FastAPI以其高性能和简洁的代码结构成为了构建RESTful API的热门选择。而Axios则因其基于Promise的HTTP客户端特性&#xff0c;成为了前端与后端交互的理想工具。本文将介绍FastAPI和Axios的结合使用&#xff0c;通过一个用户增删改查&#xff08;C…...

插入排序算法

一、基本思想 插入排序通过构建有序序列&#xff0c;对于未排序的数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。它重复这个过程直到所有数据都被处理过。 二、示例 public class InsertionSort {public static void main(String[] args) {in…...

如何启动 Docker 服务:全面指南

如何启动 Docker 服务:全面指南 一、Linux 系统(以 Ubuntu 为例)二、Windows 系统(以 Docker Desktop 为例)三、macOS 系统(以 Docker Desktop for Mac 为例)四、故障排查五、总结Docker,作为一种轻量级的虚拟化技术,已经成为开发者和运维人员不可或缺的工具。它允许用…...

摄影相关常用名词

本文介绍与摄影相关的常用名词。 曝光 Exposure 感光元件接收光线的过程&#xff0c;决定图像的明暗程度和细节表现。 光圈 Aperture 控制镜头进光量的孔径大小&#xff0c;用 F 值&#xff08;f-stop&#xff09; 表示。 光圈越大&#xff08;F 值越小&#xff09;&#xff0c…...

kafka消费者组和分区数之间的关系是怎样的?

消费者组和分区数之间的关系决定了Kafka中消息的消费方式和负载均衡。合理配置分区数和消费者数量对于优化Kafka的性能和资源利用率至关重要。以下是这种关系的几个关键点&#xff1a; 一个分区只能被同一组的一个消费者消费&#xff1a;这是为了保证消息的顺序性。在同一个消费…...

【num_groups、 groups、init_filters以及归一化的选择】

目录 省流总结&#xff1a;一、num_groups与 groups的关系1. num_groups在代码中的作用(1) 定义(2) num_groups的值的不同影响1. 每组的通道数量&#xff1a;2. 计算效率&#xff1a;3. 对模型表现的影响&#xff1a;4. 对分割任务的影响&#xff1a;5. 训练稳定性&#xff1a;…...