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

Spring03——基于xml的Spring应用

Spring开发中主要对Bean的配置

Bean的常用配置一览如下:

Xml配置方式功能描述
<bean id="" class="">Bean的id和全限定名配置
<bean name="">通过name设置Bean的别名,通过别名也能直接获取到Bean实例
<bean scope="">Bean的作用范围,BeanFactory作为容器时取值singleton和prototype
<bean lazy-init="">Bean的实例化时机,是否延迟加载。BeanFactory作为容器时无效
<bean init-method="">Bean实例化后自动执行的初始化方法,method指定方法名
<bean destroy-method="">Bean实例销毁前的方法,method指定方法名
<bean autowire="byType">设定自动注入模式,常用的有按类型byType,按名称byName
<bean factory-bean="" factory-method=""/>指定哪个工厂Bean的哪个方法来完成Bean的创建

 Bean取别名

通过name取别名,同样可以获取实例

 

Bean的范围配置

默认情况下,单纯的Spring环境Bean的作用范围有两个(scope配置):Singleton和Prototype

  • singleton:单例,默认值,Spring容器创建的时候,就会进行Bean的实例化,并存储到容器内部的单例池中,每次getBean时都是从单例池中获取相同的Bean实例;
  • prototype(默认):原型,Spring容器初始化时不会创建Bean实例,当调用getBean时才会实例化Bean,每次getBean都会创建一个新的Bean实例。

Bean的延迟加载

当lazy-init设置为true时为延迟加载,也就是当Spring容器创建的时候,不会立即创建Bean实例等待用到时在创建Bean实例并存储到单例池中去,后续在使用该Bean直接从单例池获取即可本质上该Bean还是单例

<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl" lazy-init="true"/> 
        ApplicationContext applicationContext = new                 ClassPathXmlApplicationContext("applicationContext.xml");// lazy-init="true"开启,那么只有调用getBean时才会创建Bean实例,而不是之前创建容器时UserService userService = (UserService) applicationContext.getBean("aaa");System.out.println(userService);

Bean的初始化和销毁方法配置

Bean在被实例化后,可以通过指定的初始化方法完成一些初始化的操作,Bean在销毁之前也可以执行指定的销毁方法完成一些操作。

<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"init-method="init" destroy-method="destroy"/>

定义init方法和destory方法 

public class UserDaoImpl implements UserDao {  public UserDaoImpl() { System.out.println("UserDaoImpl创建了..."); }  public void init() { System.out.println("初始化方法..."); }  public void destroy() { System.out.println("销毁方法..."); }  
}

 

 由上图可见,并没有显示销毁方法

关闭容器Bean就销毁,否则bean销毁不了,因为关闭容器是在虚拟机结束之前执行,如果没有close,那么虚拟机关闭,什么都没有了。 

扩展:除此之外,我们还可以通过实现 InitializingBean 接口,完成一些Bean的初始化操作,如下:

public class UserDaoImpl implements UserDao, InitializingBean {  public UserDaoImpl() { System.out.println("UserDaoImpl创建了..."); }  public void init() { System.out.println("初始化方法..."); }  public void destroy() { System.out.println("销毁方法..."); }  // 执行时机早于init-method配置的方法  @Overridepublic void afterPropertiesSet() throws Exception {  System.out.println("InitializingBean...");  }  
}

  使用InitializingBean , DisposableBean接口(推荐)

 这样就不需要再Bean标签里写init和destory了

Bean的生命周期 

下面是Spring Bean生命周期示例,包括创建、初始化和销毁的代码。

Bean类

创建一个简单的Bean类,并定义初始化和销毁方法:

import org.springframework.beans.factory.InitializingBean;  
import org.springframework.beans.factory.DisposableBean;  public class MyBean implements InitializingBean, DisposableBean {  private String name;  private String version;  private String author;  public MyBean() {  System.out.println("1. 创建对象 - 构造器");  }  public void setName(String name) {  this.name = name;  System.out.println("设置属性 - name: " + name);  }  public void setVersion(String version) {  this.version = version;  System.out.println("设置属性 - version: " + version);  }  public void setAuthor(String author) {  this.author = author;  System.out.println("设置属性 - author: " + author);  }  @Override  public void afterPropertiesSet() throws Exception {  System.out.println("4. 执行Bean初始化方法 (afterPropertiesSet)");  System.out.println("Bean 信息 - Name: " + name + ", Version: " + version + ", Author: " + author);  }  @Override  public void destroy() throws Exception {  System.out.println("关停 Bean - 销毁方法 (destroy)");  }  public void performTask() {  System.out.println("执行业务操作 - " + name);  }  
}

Spring配置

使用XML配置来定义Bean,指定其由接口管理的初始化和销毁方法:

 <bean id="myBean" class="com.example.MyBean">  <property name="name" value="Spring Bean"/>  <property name="version" value="1.0"/>  <property name="author" value="John Doe"/>  </bean>  

主程序

创建Application类,加载Spring上下文,使用Bean并关闭上下文以触发销毁阶段:

import org.springframework.context.ApplicationContext;  
import org.springframework.context.support.ClassPathXmlApplicationContext;  public class Application {  public static void main(String[] args) {  ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");  MyBean myBean = (MyBean) context.getBean("myBean");  // 执行myBean的一些业务// 关闭上下文,触发销毁方法  ((ClassPathXmlApplicationContext) context).close();  }  
}

Bean的3种实例化

构造方式实例化:底层通过构造方法对Bean进行实例化  

工厂方式实例化:底层通过调用自定义的工厂方法对Bean进行实例化

Bean的实例化配置

构造方式实例化Bean又分为无参构造方法实例化和有参构造方法实例化,Spring中配置的<bean>几乎都是无参构造方式,但处不在赘述。下面讲解有参构造方法实例化Bean

// 有参构造方法  
public UserDaoImpl(String name){  
}

在实现类文件里默认有一个无参构造器,如果写一个有参构造器,那么jvm识别不到无参构造器会报错 。

在实现类文件中写入有参构造方法后,有参构造在实例化Bean时,需要参数的注入,通过<constructor-arg>标签(name表示传入的变量名,value表示变量名对应的传入参数,在bean标签里传入即可,调用getBean会自动添加进去,如果有多个参数,就多个<constructor-arg>标签),嵌入在<bean>标签内部提供构造参数,如下:

        <!--上面的有参构造器对应的xml配置-->
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">  <constructor-arg name="name" value="haohao"/>  
</bean>

静态工厂创建对象

factory-method 创建对象:即在xml的bean标签里配置factory-method = "userDao",那么创建getBean对象返回的不是class对应的类的实例,而是class类里面userDao静态方法返回的实例

<bean id="userDao1" class="com.itheima.factory.MyBeanFactory1"factory-method="userDao"></bean>
public class MyBeanFactory1 {public static UserDao userDao(){// bean之前可以进行其他的业务逻辑操作return new UserDaoImpl();}
}

实例工厂创建对象

<--实例化一个工厂-->
<bean id="myBeanFactory2" class="com.itheima.factory.MyBeanFactory2"lazy-init="true"></bean>
<--factory-bean是代指工厂-->
<bean id="userDao2" factory-bean="myBeanFactory2" 
factory-method="userDao" lazy-init="true"></bean>

public class MyBeanFactory2 {
// 实例方法返回对象public UserDao userDao(){return new UserDaoImpl();}
}

FactoryBean创建(实用)

package com.itheima.factory;import com.itheima.dao.UserDao;
import com.itheima.dao.impl.UserDaoImpl;
import org.springframework.beans.factory.FactoryBean;public class UserDaoFactoryBean implements FactoryBean {// 返回bean@Overridepublic UserDao getObject() throws Exception {return new UserDaoImpl();}// 返回Bean的类型@Overridepublic Class<?> getObjectType() {return UserDao.class;}
// 是否为单例@Overridepublic boolean isSingleton() {return true;}
}
<bean id="UserDao" class="com.itheima.factory.UserDaoFactoryBean"></bean>

 依赖注入的方式

一、setter方法注入引用类型/简单类型(下面以同时注入这两种类型为例)

假设我们有一个Product类,它包含一个简单类型属性(如productId)和一个引用类型属性(如Category)。

1. 定义Category

首先,定义Category类,表示产品类别:

public class Category {  private String categoryName;  // Setter方法  public void setCategoryName(String categoryName) {  this.categoryName = categoryName;  }  // Getter方法  public String getCategoryName() {  return categoryName;  }  public void displayInfo() {  System.out.println("Category: " + categoryName);  }  
}

2. 定义Product

接下来,定义一个Product类,它具有一个简单类型的productId和一个引用类型的Category

public class Product {  private String productId; // 简单类型  private Category category; // 引用类型  // Setter方法注入  public void setProductId(String productId) {  this.productId = productId;  }  public void setCategory(Category category) {  this.category = category;  }  public void displayProductInfo() {  System.out.println("Product ID: " + productId);  if (category != null) {  category.displayInfo();  } else {  System.out.println("No category information available.");  }  }  
}

3. Spring配置文件

在Spring的XML配置文件中,定义CategoryProduct的Bean,并同时注入简单类型和引用类型:

<!-- applicationContext.xml -->  
<beans xmlns="http://www.springframework.org/schema/beans"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans.xsd">  <bean id="category" class="com.example.Category">  <property name="categoryName" value="Electronics"/> <!-- 注入简单类型 -->  </bean>  <bean id="product" class="com.example.Product">  <property name="productId" value="P12345"/>        <!-- 注入简单类型name是形参 -->  <property name="category" ref="category"/>         <!-- 注入引用类型 -->  </bean>  
</beans>

4. 主程序

最后,创建一个主程序,通过Spring上下文来获取Product对象并执行相应操作:

import org.springframework.context.ApplicationContext;  
import org.springframework.context.support.ClassPathXmlApplicationContext;  public class Application {  public static void main(String[] args) {  // 加载Spring上下文  ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");  // 获取product Bean  Product product = (Product) context.getBean("product");  product.displayProductInfo(); // 显示产品信息  // 关闭上下文  ((ClassPathXmlApplicationContext) context).close();  }  
}

运行结果

运行程序将输出以下内容:

Product ID: P12345  
Category: Electronics

二、构造器注入引用类型/简单类型(下面以同时注入这两种类型为例)

1. 定义Category

Category类保持不变,依然表示产品类别

2. 定义Product

Product类的构造函数修改为接收两个参数:一个简单类型productId和一个引用类型Category

public class Product {  private String productId; // 简单类型  private Category category; // 引用类型  // 构造函数注入  public Product(String productId, Category category) {  this.productId = productId;  this.category = category;  }  public void displayProductInfo() {  System.out.println("Product ID: " + productId);  if (category != null) {  category.displayInfo();  } else {  System.out.println("No category information available.");  }  }  
}

3. Spring配置文件

在Spring的XML配置文件中,使用构造器来注入简单类型和引用类型。我们可以使用constructor-arg来指定构造函数参数:

<!-- applicationContext.xml -->  
<beans xmlns="http://www.springframework.org/schema/beans"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans.xsd">  <bean id="category" class="com.example.Category">  <property name="categoryName" value="Electronics"/> <!-- 注入简单类型 -->  </bean>  <bean id="product" class="com.example.Product">  <constructor-arg value="P12345"/>              <!-- 注入简单类型 -->  <constructor-arg ref="category"/>               <!-- 注入引用类型 -->  </bean>  
</beans>

4. 主程序

主程序实例保持不变,只是调用已经不同的注入手段(构造器)来获取Product对象并执行操作

  • 强制依赖使用构造器进行,使用setter注入有概率不进行时导致null对象出现
  • 可选依赖使用setter注入进行,灵活性强
  • Spring框架倡导使用构造器,第三方框架内部多数采用构造器注入的形式进行数据初始化,相对严谨
  • 如果有必要可以同时使用,使用构造器注入完全依赖的注入,使用setter注入完成可选依赖的注入
  • 实际开发过程中需要根据实际情况分析,如果受控对象没有提供setter方法就必须使用构造器注入
  • 自己开发的模块推荐使用setter注入 

依赖自动装配

  • 自动装配用于引用类型依赖注入,不能对简单类型进行操作
  • 使用按类型装配时(byType)必须保证容器中相同类型的bean唯一,推荐使用
  • 使用按名称装配时(byName)必须保证容器中具有指定名称的bean,因为变量名与配置混合,不推荐使用
  • 自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效

集合的注入

<!-- 定义一个bean,id为bookDao,对应的实现类为com.itheima.dao.impl.BookDaoImpl -->
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"><!-- 配置一个名为array的属性,类型为数组 --><property name="array"><!-- 数组元素 --><array><!-- 数组中的值 --><value>100</value><value>200</value><value>300</value></array></property><!-- 配置一个名为list的属性,类型为列表 --><property name="list"><!-- 列表元素 --><list><!-- 列表中的值 --><value>itcast</value><value>itheima</value><value>boxuegu</value><value>chuanzhihui</value></list></property><!-- 配置一个名为set的属性,类型为集合 --><property name="set"><!-- 集合元素 --><set><!-- 集合中的值,注意集合不允许重复值 --><value>itcast</value><value>itheima</value><value>boxuegu</value><!-- 重复的值boxuegu将被忽略 --><value>boxuegu</value></set></property><!-- 配置一个名为map的属性,类型为映射 --><property name="map"><!-- 映射元素 --><map><!-- 映射中的键值对 --><entry key="country" value="china"/><!-- 可以继续添加更多的键值对 --></map></property>
</bean>

相关文章:

Spring03——基于xml的Spring应用

Spring开发中主要对Bean的配置 Bean的常用配置一览如下&#xff1a; Xml配置方式功能描述<bean id"" class"">Bean的id和全限定名配置<bean name"">通过name设置Bean的别名&#xff0c;通过别名也能直接获取到Bean实例<bean sc…...

IDEA 鼠标悬浮显示方法注释 javaDoc 及配置遇到的问题

方法详情&#xff1a; 鼠标悬浮时的效果&#xff1a; 设置方法&#xff1a; File -> Settings -> Editor -> Code Editing -> Quick Documentation,勾选红框中的选项 可能会遇到的问题&#xff1a; 如果不能选中&#xff0c;如下图 把下图的位置的选中项取消掉 选…...

openstack创建浮动IP全过程

1、创建外部网络&#xff0c;即是provider网络&#xff0c;有关provider网络的详细解释请参见我之前的文章openstack中的self-service和provider网络_openstack provider网络不能创建vlan吗-CSDN博客 network create --share --external --provider-physical-network physnet1…...

利用空闲主机进行Nmap隐匿扫描:IP伪造与空闲扫描技术

IP伪造与空闲扫描技术 在网络安全领域&#xff0c;扫描和识别目标主机的开放端口是攻击者获取目标信息的重要手段。传统的扫描方法可能会暴露扫描者的真实IP地址&#xff0c;从而引起目标主机的警觉。然而&#xff0c;IP地址伪造是一种巧妙的方式&#xff0c;可以帮助攻击者在…...

vue聊天对话语音消息播放动态特效

vue2写法&#xff0c;vue3也能用&#xff0c;粘之即走&#xff1a; 示例&#xff1a; <template><div class"voice-hidden"><divclass"voice-play-chat":class"[className, { animate-stop: !isPlaying }]"><div class&q…...

流媒体之linux下离线部署FFmpeg 和 SRS

前言 用户对网络做了限制&#xff0c;只能访问指定的网址&#xff0c;和没网没啥区别&#xff0c;导致无法连接外网&#xff0c;无法获取安装包&#xff0c;还有一些编译需要的开源工具 用户需要用平台查看库房的海康摄像头实时监控&#xff0c;只能在库房里一台纯净的ubantu…...

C/C++内存管理

1. C/C内存分布 我们先来看下面的一段代码和相关问题 const int a&#xff08;此时an存放在栈上&#xff09;char char2[] "abcd"&#xff08;此时是在栈上创建5个char类型大小的数组&#xff0c;并让用常量字符串来初始化数组内的内容&#xff0c;*char2就是数组…...

xiaolin coding 图解 MySQL笔记——锁篇

1. 全局锁是怎么用的&#xff1f; flush tables with read lock 执行以后&#xff0c;整个数据库就处于只读状态了&#xff0c;这时其他线程执行对数据的增删改操作&#xff08;insert、delete、update&#xff09;&#xff1b;对表结构的更改操作&#xff08;alter table、dr…...

node.js实现分页和jwt鉴权机制

const express require(express); const jwt require(jsonwebtoken); const app express(); // 模拟数据库 const db { users: [ { id: 1, username: user1, email: user1example.com }, // ...更多用户 ], // ...其他数据模型 }; // 应用中间件 app.use(express.json…...

Issue id: AppLinkUrlError 应用intent-filter 配置深链接 URL 问题分析 | AndroidManifest

AndroidManifest.xml 配置文件中&#xff0c;对 activity 组件进行声明的时候&#xff0c;独立应用在 IDE 显示 intent-filter 报错&#xff0c;但不影响实际编译&#xff0c;因为是系统应用&#xff0c;肯定会有此 URL 的存在。 AOSP 源码&#xff1a; <activity android:…...

STM32F103 PWM配置

在《STM32F103定时器配置》中我们介绍了PWM的产生原理&#xff0c;本节介绍介绍如何编码实现PWM的输出。 一、PWM相关寄存器 TIMx如果要产生PWM&#xff0c;除了我们上一节提到的如下寄存器&#xff1a; 控制寄存器(TIMx_CR1)&#xff1b;DMA/中断使能寄存器(TIMx_DIER)&#x…...

C语言蓝桥杯进阶

系列文章目录 文章目录 系列文章目录前言一、题目1、在 ISO 国际标准中定义了 A0 纸张的大小为 1189mm 841mm&#xff0c;将 A0 纸沿长边对折后为 A1 纸&#xff0c;大小为 841mm 594mm&#xff0c;在对折的过程中长度直接取下整&#xff08;实际裁剪时可能有损耗&#xff09…...

【笔记2-2】ESP32:开发板与espidf插件的一些配置项

主要参考b站宸芯IOT老师的视频&#xff0c;记录自己的笔记&#xff0c;老师讲的主要是linux环境&#xff0c;但配置过程实在太多问题&#xff0c;就直接用windows环境了&#xff0c;老师也有讲一些windows的操作&#xff0c;只要代码会写&#xff0c;操作都还好&#xff0c;开发…...

【Linux】线程概念 | 线程控制

文章目录 &#x1f449;知识补充&#x1f448;&#x1f449;Linux线程概念&#x1f448;什么是线程Makefile线程 VS 进程线程的优点线程的缺点线程异常线程用途 &#x1f449;线程控制&#x1f448;线程终止pthread_exit 函数pthread_cancel 函数线程 ID 的深入理解在多线程的场…...

OCR的评价指标和常用数据集

1.OCR任务简介 OCR(Optical Character Recognition,光学字符识别)是指对包含文本内容的图像或者视频进行处理识别&#xff0c;并提取其中所包含的文字及排版信息的过程。例如&#xff0c;一个常见的应用是将包含文档图像的不可编辑状态的 PDF 文档通过 OCR 技术识别后&#xf…...

React性能优化

三个可以优化的地方 避免过度多次渲染 组件会在以下情况下重新渲染 注意&#xff1a;例如组件组合的形式&#xff0c;<Test><Counter></Counter></Test>,即使Test发生了重新渲染&#xff0c;Counter也不会重新渲染。另外使用React这样的库或框架时&a…...

Django之ORM

1.ORM介绍 ORM概念 对象关系映射&#xff08;Object Relational Mapping&#xff0c;简称ORM&#xff09;模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。 简单的说&#xff0c;ORM是通过使用描述对象和数据库之间映射的元数据&#xff0c;将程序中的对…...

macos上设置windsurf命令行启动

解决方案 1. 在/usr/local/bin 目录下创建软链 sudo ln -s /Applications/Windsurf.app/Contents/Resources/app/bin/windsurf /usr/local/bin/windsurf 2. 执行source source ~/.zshrc...

一、web基础和http协议

前言 https://www.baidu.com/&#xff1a;URL&#xff08;是一种万维网寻址网址&#xff09; https://&#xff1a;协议&#xff0c;加密的http&#xff0c;加密的超文本传输协议&#xff0c;在数据传输之前要通过整数进行身份验证&#xff0c;验证通过才可以进行数据传输。 …...

Can‘t find variable: token(token is not defined)

文章目录 例子 1&#xff1a;使用 var例子 2&#xff1a;使用 let 或 const例子 3&#xff1a;异步操作你的代码中的情况 Cant find variable: tokentoken is not defined源代码 // index.jsPage({data: {products:[],cardLayout: grid, // 默认卡片布局为网格模式isGrid: tr…...

Elasticsearch ILM 故障排除:常见问题及修复

作者&#xff1a;来自 Elastic Stef Nestor 大家好&#xff01;我们的 Elasticsearch 团队正在不断改进我们的索引生命周期管理 (index Lifecycle Management - ILM) 功能。当我第一次加入 Elastic Support 时&#xff0c;我通过我们的使用 ILM 实现自动滚动教程快速上手。在帮…...

1. 设计模式的由来

设计模式的灵感来自建筑师亚历山大的“设计套路”&#xff0c;后来被程序员借用&#xff0c;总结出一套“编程武功秘籍”。 20世纪90年代&#xff0c;四位软件工程师&#xff08;被称为“四人帮”&#xff09;——Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides&…...

【Excel】Excel中将日期格式转换为文本格式,并按日期显示。

【问题需求】 在使用excel进行数据导入的过程中&#xff0c; 有的软件要求日期列必须是文本格式。 但是直接将日期列的格式改为文本后&#xff0c;显示一串数字&#xff0c;而不按日期显示。 进而无法导入使用。 【解决方法】 使用【TXET】函数公式进行处理&#xff0c; 在单独…...

SpringBoot入门:如何新建SpringBoot项目(保姆级教程)

在本文中&#xff0c;我们将演示如何新建一个基本的 Spring Boot 项目。写这篇文章的时候我还是很惊讶的&#xff0c;因为我发现有些java的初学者&#xff0c;甚至工作10年的老员工居然并不会新建一个SpringBoot项目&#xff0c;所以特别出了一篇文章来教大家新建一个SpringBoo…...

什么是Layer Normalization?

一、概念 前面的文章中&#xff0c;我们介绍了Batch Normalization。BN的目的是使得每个batch的输入数据在每个维度上的均值为0、方差为1&#xff08;batch内&#xff0c;数据维度A的所有数值均值为0、方差为1&#xff0c;维度B、C等以此类推&#xff09;&#xff0c;这是由于神…...

基于神经网络的弹弹堂类游戏弹道快速预测

目录 一、 目的... 1 1.1 输入与输出.... 1 1.2 隐网络架构设计.... 1 1.3 激活函数与损失函数.... 1 二、 训练... 2 2.1 数据加载与预处理.... 2 2.2 训练过程.... 2 2.3 训练参数与设置.... 2 三、 测试与分析... 2 3.1 性能对比.... 2 3.2 训练过程差异.... 3 四、…...

ASP.NET CORE API 解决跨域问题

环境 vs2022 .net 8 创建ASP.net Core API项目 配置跨域 编写ApiController 启动项目 得到服务器运行的 地址 在Hbuiler中创建web项目&#xff0c;编写代码 【运行】-【运行到浏览器】-选择一个浏览器,查看结果 正常显示 问题 如果允许所有源访问&#xff0c;有安全风险方…...

西安理工大学丨ChatGPT助力学术论文写作训练营-助力发表SCI一区、二区

在当今学术研究中&#xff0c;科研人员在撰写论文时面临诸多挑战。首先是信息量的剧增&#xff0c;科研人员需要快速消化新知识&#xff0c;筛选相关信息并清晰表达。但论文写作不仅是信息的罗列&#xff0c;还需要条理清晰、逻辑严密、语言精准&#xff0c;特别是在竞争激烈的…...

Android hid 数据传输(device 端 )

最近一直在处理hid 数据需求&#xff0c;简而言之就是两台设备直接可以通过usb 线互相传递数据。 项目架构 为什么Device 端要采用HID&#xff08;人机接口设备&#xff09;的方式发送和接收数据呢&#xff1f; 主要是速度快&#xff0c;举个例子&#xff0c;就是鼠标移动&am…...

Facebook 人工智能:重塑社交新未来

在数字化迅速发展的今天&#xff0c;人工智能(AI)已经深入了我们的生活&#xff0c;尤其是在社交媒体领域。Facebook作为全球最大的社交平台之一&#xff0c;正利用AI技术&#xff0c;革新其服务和用户体验&#xff0c;为用户打造社交互动的新未来。 首先&#xff0c;人工智能…...

UIlicious - 自动化端到端测试

在现代软件开发中&#xff0c;测试自动化已然成为产品交付质量的基石。而端到端测试&#xff08;E2E&#xff09;&#xff0c;作为验证整个应用流畅运行的关键&#xff0c;常常是测试工作中最具挑战性的一环。这时&#xff0c;一款简单高效的自动化测试工具——UIlicious&#…...

PHP 与 MySQL 搭配的优势

一、PHP 与 MySQL 搭配的优势 强大的动态网页开发能力 PHP 是一种服务器端脚本语言&#xff0c;能够生成动态网页内容。它可以根据用户的请求、数据库中的数据等因素&#xff0c;实时地生成 HTML 页面返回给客户端浏览器。而 MySQL 是一个流行的关系型数据库管理系统&#xf…...

HDFS 操作命令

在现代的企业环境中&#xff0c;单机容量往往无法存储大量数据&#xff0c;需要跨机器存储。统一管理分布在 集群上的文件系统称为 分布式文件系统 。 HDFS &#xff08; Hadoop Distributed File System &#xff09;是 Apache Hadoop 项目的一个子项目&#xff0c; Hadoo…...

第四篇:k8s 理解Service工作原理

什么是service&#xff1f; Service是将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法。 简单来说K8s提供了service对象来访问pod。我们在《k8s网络模型与集群通信》中也说过k8s集群中的每一个Pod&#xff08;最小调度单位&#xff09;都有自己的IP地址&#xff0c;都…...

什么是TCP的三次握手?

TCP的三次握手&#xff1a;深入理解建立可靠连接的过程 引言 在计算机网络中&#xff0c;传输控制协议&#xff08;TCP&#xff09;是确保数据可靠传输的核心协议之一。TCP通过三次握手机制来建立一个稳定的、双向的连接&#xff0c;这对于确保数据的完整性和顺序至关重要。本…...

Pytorch使用手册- TorchVision目标检测微调Tutorial的使用指南(专题十二)

这篇教程的目标是对一个预训练的 Mask R-CNN 模型进行微调,应用于 Penn-Fudan 行人检测与分割数据集。该数据集包含 170 张图像,里面有 345 个行人实例,我们将通过这个教程来演示如何使用 torchvision 中的新特性,训练一个面向自定义数据集的目标检测和实例分割模型。 注意…...

Modern Effective C++条款三十五:优先考虑基于任务的编程而非基于线程的编程

C中开发者可以通过两种主要方式异步执行一个函数&#xff0c;如doAsyncWork()。这两种方法分别是基于线程(thread-based)和基于任务(task-based)的方式。 基于线程的方式 使用std::thread创建一个新的线程来执行doAsyncWork()函数&#xff0c;直接且直观&#xff0c;但也有其…...

lyapunov指数的绘制

有如下方程&#xff1a; %% 方程式 % x(n1)1y(n)-a*x(n)^2 % y(n1)b*x(n)绘制其对应的lyapunov指数。 MATLAB实现方式&#xff1a; clc; clearvars; close all;%% 方程式 % x(n1)1y(n)-a*x(n)^2 % y(n1)b*x(n)%% 代码 N 1000; a (0:0.001:1.4); b 0.3; na length(a…...

WPF+MVVM案例实战与特效(三十二)- 封装一个Appconfig 操作类(保留注释)

文章目录 1、概述2、ConfigHelper 的功能3、代码实现1、ConfigHelper.cs 代码2、帮助类使用4、总结1、概述 在开发 WPF 应用程序时,配置文件(如 App.config )是存储应用程序设置、连接字符串和其他运行时信息的常用方式。然而,直接操作这些配置文件可能会涉及到复杂的 XML…...

决策树:ID3、C4.5和CART特征选择方式

1 前言 该文章主要目的是记录ID3、C4.5和CART特征选择方式&#xff0c;这里只对决策树进行简单介绍。 决策树&#xff08;Decision Tree&#xff09;算法是一种有监督学习算法&#xff0c;它利用分类的思想&#xff0c;根据数据的特征构建数学模型&#xff0c;从而达到数据的筛…...

02 conda常用指令

目录 命令快速查找命令详细解释列出当前conda中存在的解释器环境使用指定的解释器环境创建虚拟环境激活自己创建的虚拟环境虚拟环境删除切换回主环境找到你计算机中安装的miniconda3的跟目录找到虚拟环境的目录选择需要删除的虚拟环境文件夹确认环境是否删除 补充删除虚拟环境指…...

从仪表盘探索 MongoDB 关键指标

这是 MongoDB 监控系列文章的第七篇&#xff0c;前面几篇文章的链接如下&#xff1a; MongoDB 监控&#xff08;一&#xff09;MongoDB 监控&#xff08;二&#xff09;MongoDB 监控&#xff08;三&#xff09;MongoDB 监控&#xff08;四&#xff09;MongoDB 监控&#xff08…...

Grule前端表单post后端执行grule引擎规则

Grule前端表单post后端执行grule引擎规则 编写前端表单和后端接口 编写test.go执行grule引擎规则 示例都是 go test 执行的测试代码&#xff0c;所以将里面的测试代码去除 由于之前 NumberExponentExample_test.go 已经验证可运行, 所以将 err 的异常处理去除 package mai…...

EasyRTC支持嵌入式智能硬件与微信小程序实时通话

基础建设如此发达的时代&#xff0c;各种物联网设备都越来越普及&#xff0c;尤其是可穿戴设备和智能家居设备的发展&#xff0c;而在物联网设备中&#xff0c;视频物联网设备又是特别受人关注的设备&#xff0c;因为他们具备有看得见的属性&#xff0c;像智能家居里面的摄像头…...

openGauss开源数据库实战十九

文章目录 任务十九 openGauss DML 语句测试任务目标实施步骤一、准备工作二、INSERT语句三、DELETE语句四、UPDATE语句五、清理工作 任务十九 openGauss DML 语句测试 任务目标 掌握DML语句的用法,包括INSERT语句、DELETE语句和UPDATE语句。 实施步骤 一、准备工作 使用Li…...

基于XML的AOP开发

AOP 为 Aspect Oriented Programming 的缩写&#xff0c;意思为面向切面编程。 AOP相关术语&#xff1a; 目标对象(Target)&#xff1a; 你要去代理的对象&#xff0c;可以理解为之前很单纯的那个对象。 代理对象(Proxy)&#xff1a; 你把你那个单纯的对象给我&#xff0c…...

获取Ubuntu-22.04.1 对应的vmlinux文件

0.前言 &#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1…...

Python后端 -- 万字长文全面解析Django框架

自从2005年诞生以来&#xff0c;Django因其“开发速度快、安全性高”的特点迅速成为许多开发者的首选。无论是小型的个人项目&#xff0c;还是大型的企业应用&#xff0c;Django都能游刃有余地满足需求。我们将从Django的基础知识带你全面掌握Django&#xff0c;从基础知识到高…...

“指标管理系统”是什么?企业如何搭建指标管理系统?

在当今数字化时代&#xff0c;数据已成为企业决策的重要依据。然而&#xff0c;海量数据中如何筛选出关键指标&#xff0c;并对其进行有效管理&#xff0c;成为了众多企业面临的难题。为此&#xff0c;指标管理系统应运而生&#xff0c;它旨在帮助企业规范化定义、统一管理和高…...

Node.js简单接口实现教程

Node.js简单接口实现教程 1. 准备工作 确保您的计算机已安装&#xff1a; Node.js (建议版本16.x以上)npm (Node包管理器) 2. 项目初始化 # 创建项目目录 mkdir nodejs-api-tutorial cd nodejs-api-tutorial# 初始化npm项目 npm init -y# 安装必要依赖 npm install expres…...