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

SpringBoot(二)--- SpringBoot基础(http协议、分层解耦)

目录

前言

一、SpringBoot入门

1.入门程序

2.解析

二、HTTP协议

1.HTTP概述

2.HTTP请求协议

2.1 GET方式的请求协议

2.2 POST方式的请求协议

2.3 两者的区别

2.4 获取请求数据

3.HTTP响应协议

三、分层解耦

1.三层架构

2.IOC&DI

2.1 入门

2.2 IOC详解

2.3 DI详解

2.4 注意事项


前言

我们可以通过HTML、CSS、JS这三项技术进行前端页面的开发,最终,这些前端页面,我们就可以部署在服务器上,然后打开浏览器就可以直接访问服务器上部署的前端页面了。而像这HTML、CSS、JS 以及图片、音频、视频等这些资源,我们都称为静态资源。 所谓静态资源,就是指在服务器上存储的不会改变的数据,通常不会根据用户的请求而变化。

与静态资源相对的就是动态资源,即在服务器端进行存储,会根据用户请求和其他数据动态生成,内容可能会在每次请求时都发生变化。我们可以基于Spring框架来构建动态资源

对于java程序开发的动态资源来说,我们通常会将这些动态资源部署在Tomcat(Tomcat服务器),这样的Web服务器中运行。 而浏览器与服务器在通信的时候,基本都是基于HTTP协议的。


一、SpringBoot入门

1.入门程序

在com.example.demo这个包下创建HelloController类

类中的代码如下:

package com.example.demo;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController// 表明是个请求处理类
public class HelloController {@RequestMapping("/hello") // 标识请求路径public String hello(String name) {System.out.println("HelloController...hello:" + name);return "Hello" + name;}
}

上面的hello方法中参数是前端给服务器提交的参数,return表示服务器给前端返回的数据。

运行SpringBoot自动生成的引导类 (标识有@SpringBootApplication注解的类)

打开浏览器,输入http://localhost:8080/hello?name=xiaoming

可以发现,前端页面在网址栏向服务器传递了xiaoming这个参数,然后服务器将这个参数重新相应给了前端页面。

2.解析

我们发现运行SpringBoot自动生成的引导类就可以启动整个服务,这是为什么呢?

因为我们在创建springboot项目的时候,选择了web开发的起步依赖 spring-boot-starter-web。而spring-boot-starter-web依赖,又依赖了spring-boot-starter-tomcat,由于maven的依赖传递特性,那么在我们创建的springboot项目中也就已经有了tomcat的依赖,这个其实就springboot中内嵌的tomcat。

而运行引导类中的main方法,其实启动的就是springboot中内嵌的Tomcat服务器。 而我们所开发的项目,也会自动的部署在该tomcat服务器中,并占用8080端口号 。

二、HTTP协议

1.HTTP概述

HTTP:Hyper Text Transfer Protocol(超文本传输协议),规定了浏览器与服务器之间数据传输的规则。

  • http是互联网上应用最为广泛的一种网络协议

  • http协议要求:浏览器在向服务器发送请求数据时,或是服务器在向浏览器发送响应数据时,都必须按照固定的格式进行数据传递

HTTP协议

  • 基于TCP协议: 面向连接,安全。

  • 基于请求-响应模型: 一次请求对应一次响应(先请求后响应)。

  • HTTP协议是无状态协议: 对于数据没有记忆能力。每次请求-响应都是独立的

        无状态指的是客户端发送HTTP请求给服务端之后,服务端根据请求响应数据,响应完后,不会记录任何信息。

2.HTTP请求协议

浏览器将数据以请求格式发送到服务器。包括:请求行、请求头 、请求体。

2.1 GET方式的请求协议

  • 请求行(以上图中红色部分) :HTTP请求中的第一行数据。由:请求方式资源路径协议/版本组成(之间使用空格分隔)

    • 请求方式:GET

    • 资源路径:/brand/findAll?name=OPPO&status=1

      • 请求路径:/brand/findAll

      • 请求参数:name=OPPO&status=1

        • 请求参数是以key=value形式出现

        • 多个请求参数之间使用&连接

      • 请求路径和请求参数之间使用?连接

    • 协议/版本:HTTP/1.1

  • 请求头(以上图中黄色部分) :第二行开始,上图黄色部分内容就是请求头。格式为key: value形式

    • http是个无状态的协议,所以在请求头设置浏览器的一些自身信息和想要响应的形式。这样服务器在收到信息后,就可以知道是谁,想干什么了

服务端可以根据请求头中的内容来获取客户端的相关信息,有了这些信息服务端就可以处理不同的业务需求。

2.2 POST方式的请求协议

  • 请求行(以上图中红色部分):包含请求方式、资源路径、协议/版本

    • 请求方式:POST

    • 资源路径:/brand

    • 协议/版本:HTTP/1.1

  • 请求头(以上图中黄色部分)

  • 请求体(以上图中绿色部分) :存储请求参数

    • 请求体和请求头之间是有一个空行隔开(作用:用于标记请求头结束)

2.3 两者的区别

2.4 获取请求数据

web服务器对HTTP请求进行解析,并将其数据封装到了HttpServletRequest类里面,并在调用Controller方法的时候传递给了该方法。

用HttpServletRequest类型 声明一个形参(例如request),用request的方法操作具体数据。

@RestController
public class RequestController {/*** 请求路径 http://localhost:8080/request?name=Tom&age=18* @param request* @return*/@RequestMapping("/request")public String request(HttpServletRequest request){//1.获取请求参数 name, ageString name = request.getParameter("name"); // 请求数据以键值对形式存在String age = request.getParameter("age");System.out.println("name = " + name + ", age = " + age);//2.获取请求路径String uri = request.getRequestURI();String url = request.getRequestURL().toString();System.out.println("uri = " + uri);System.out.println("url = " + url);//3.获取请求方式String method = request.getMethod();System.out.println("method = " + method);//4.获取请求头String header = request.getHeader("User-Agent");System.out.println("header = " + header);return "request success";}}

3.HTTP响应协议

服务器将数据以响应格式返回给浏览器。包括:响应行 、响应头 、响应体

  • 响应行(以上图中红色部分):响应数据的第一行。响应行由协议及版本响应状态码状态码描述组成

    • 协议/版本:HTTP/1.1

    • 响应状态码:200

    • 状态码描述:OK

  • 响应头(以上图中黄色部分):响应数据的第二行开始。格式为key:value形式

    • http是个无状态的协议,所以可以在请求头和响应头中设置一些信息和想要执行的动作,这样,对方在收到信息后,就可以知道你是谁,你想干什么

  • 响应体(以上图中绿色部分): 响应数据的最后一部分。存储响应的数据

    • 响应体和响应头之间有一个空行隔开(作用:用于标记响应头结束)

关于响应状态码,我们主要有以下三个状态码:

  • 200 ok 客户端请求成功

  • 404 Not Found 请求资源不存在

  • 500 Internal Server Error 服务端发生不可预期的错误

三、分层解耦

1.三层架构

我们进行程序设计以及程序开发时,尽可能让每一个接口、类、方法的职责更单一些(单一职责原则)。尽量满足高内聚、低耦合的要求。

我们在项目开发中,可以把代码分为三层,如图所示:

  • Controller:控制层。接收前端发送的请求,对请求进行处理,并响应数据。

  • Service:业务逻辑层。处理具体的业务逻辑。

  • Dao:数据访问层(Data Access Object),也称为持久层。负责数据访问操作,包括数据的增、删、改、查。这一层主要是进行数据库的处理。

基于三层架构执行流程如图所示:

  • 前端发起的请求,由Controller层接收(Controller响应数据给前端)

  • Controller层调用Service层来进行逻辑处理(Service层处理完后,把处理结果返回给Controller层)

  • Serivce层调用Dao层(逻辑处理过程中需要用到的一些数据要从Dao层获取)

  • Dao层操作文件中的数据(Dao拿到的数据会返回给Service层)

2.IOC&DI

  • 控制反转: Inversion Of Control,简称IOC对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。对象的创建权由程序员主动创建转移到容器(由容器创建、管理对象)。这个容器称为:IOC容器或Spring容器。

  • 依赖注入: Dependency Injection,简称DI容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。程序运行时需要某个资源,此时容器就为其提供这个资源。

      • bean对象:IOC容器中创建、管理的对象,称之为:bean对象。

       

      2.1 入门

      在实现类加上 @Component 注解,就代表把当前类产生的对象交给IOC容器管理。

      来看下面的代码:

      A. UserDaoImpl

      @Component
      public class UserDaoImpl implements UserDao {@Overridepublic List<String> findAll() {InputStream in = this.getClass().getClassLoader().getResourceAsStream("user.txt");ArrayList<String> lines = IoUtil.readLines(in, StandardCharsets.UTF_8, new ArrayList<>());return lines;}
      }

      B. UserServiceImpl

      @Component
      public class UserServiceImpl implements UserService {@Autowiredprivate UserDao userDao;@Overridepublic List<User> findAll() {List<String> lines = userDao.findAll();List<User> userList = lines.stream().map(line -> {String[] parts = line.split(",");Integer id = Integer.parseInt(parts[0]);String username = parts[1];String password = parts[2];String name = parts[3];Integer age = Integer.parseInt(parts[4]);LocalDateTime updateTime = LocalDateTime.parse(parts[5], DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));return new User(id, username, password, name, age, updateTime);}).collect(Collectors.toList());return userList;}
      }

      发现UserServiceImpl这个类中声明了接口UserDao,但是它并没有创建接口的实现类对象,就是因为实现类UserDaoImpl加了@Component 注解,把当前类产生的对象交给了IOC容器管理。而在UserServiceImpl这个类中声明的接口UserDao上有@Autowired注解,它可以自动从IOC容器中取出实现类的相关对象。

      2.2 IOC详解

      IOC控制反转,就是将对象的控制权交给Spring的IOC容器,由IOC容器创建及管理对象。IOC容器创建的对象称为bean对象。

      而Spring框架为了更好的标识web应用程序开发当中,bean对象到底归属于哪一层,又提供了@Component的衍生注解:

      注意1:声明bean的时候,可以通过注解的value属性指定bean的名字,如果没有指定,默认为类名首字母小写。

      注意2:使用以上四个注解都可以声明bean,但是在springboot集成web开发中,声明控制器bean只能用@Controller。

      2.3 DI详解

      依赖注入,是指IOC容器要为应用程序去提供运行时所依赖的资源,而资源指的就是对象。

      在入门代码中,我们使用了@Autowired这个注解,完成了依赖注入的操作,而这个Autowired翻译过来叫:自动装配。@Autowired注解,默认是按照类型进行自动装配的(去IOC容器中找某个类型的对象,然后完成注入操作)

      @Autowired 进行依赖注入,常见的方式,有如下三种:

      a) 属性注入

      @RestController
      public class UserController {//方式一: 属性注入@Autowiredprivate UserService userService;}

      b). 构造函数注入

      @RestController
      public class UserController {//方式二: 构造器注入private final UserService userService;@Autowired //如果当前类中只存在一个构造函数, @Autowired可以省略public UserController(UserService userService) {this.userService = userService;}}   

      3). setter注入

      /*** 用户信息Controller*/
      @RestController
      public class UserController {//方式三: setter注入private UserService userService;@Autowiredpublic void setUserService(UserService userService) {this.userService = userService;}}    

      第一种是最常用的,因为代码最为简洁。

      2.4 注意事项

      那如果在IOC容器中,存在多个相同类型的bean对象,会出现什么情况呢?

      在下面的例子中,准备了两个UserService的实现类,并且都交给了IOC容器管理。 代码如下:

      启动项目之后,控制台报错了

      出现错误的原因是因为在Spring的容器中,UserService这个类型的bean存在两个,框架不知道具体要注入哪个bean使用,所以就报错了。

      对于上述问题,有以下解决方案:

      方案一:使用@Primary注解

      当存在多个相同类型的Bean注入时,加上@Primary注解,来确定默认的实现。

      @Primary
      @Service
      public class UserServiceImpl implements UserService {
      }

      方案二:使用@Qualifier注解

      指定当前要注入的bean对象。 在@Qualifier的value属性中,指定注入的bean的名称。 @Qualifier注解不能单独使用,必须配合@Autowired使用。

      @RestController
      public class UserController {@Qualifier("userServiceImpl")@Autowiredprivate UserService userService;
      }

      方案三:使用@Resource注解

      @RestController
      public class UserController {@Resource(name = "userServiceImpl")private UserService userService;
      }

      @Autowird 与 @Resource有什么区别?

      • @Autowired 是spring框架提供的注解,而@Resource是JDK提供的注解

      • @Autowired 默认是按照类型注入,而@Resource是按照名称注入

      相关文章:

      SpringBoot(二)--- SpringBoot基础(http协议、分层解耦)

      目录 前言 一、SpringBoot入门 1.入门程序 2.解析 二、HTTP协议 1.HTTP概述 2.HTTP请求协议 2.1 GET方式的请求协议 2.2 POST方式的请求协议 2.3 两者的区别 2.4 获取请求数据 3.HTTP响应协议 三、分层解耦 1.三层架构 2.IOC&DI 2.1 入门 2.2 IOC详解 2.…...

      mongodb部署Shard Cluster

      一、创建集群认证文件 mkdir ./data ./confopenssl rand -base64 756 > ./conf/keyfilechmod 400 ./conf/keyfiledocker network create mongo-cluster二、部署configsever副本集 #!/bin/bash inamemongodb:8.0.9 conf_namemongo_conf_ replset_nameconfrsecho "…...

      【大数据】MapReduce 编程--索引倒排--根据“内容 ➜ 出现在哪些文件里(某个单词出现在了哪些文件中,以及在每个文件中出现了多少次)

      将 Hadoop 所需的 JAR 文件添加到项目中&#xff0c;确保可以使用 Hadoop 的 API JAR (Java Archive) 文件是一种用于打包多个 Java 类文件、资源文件&#xff08;如图片、配置文件等&#xff09;以及元数据的压缩文件格式。它类似于 ZIP 文件&#xff0c;但 JAR 文件通常用于 …...

      使用PHP对接东南亚、日本、印度和印度尼西亚股票数据源

      本文将介绍如何通过StockTV提供的API接口&#xff0c;使用PHP语言来获取并处理东南亚&#xff08;包括马来西亚、新加坡等&#xff09;、日本、印度以及印度尼西亚的股票市场数据。我们将以获取市场列表、查询公司信息、查看涨跌排行榜为例&#xff0c;展示具体的操作流程。 准…...

      从基础到高级:网站反爬技术全景解析与第三方工具对比

      网站反爬与用户行为检测实战指南:从基础防护到智能识别 在当今数据驱动的互联网时代,网站面临着日益复杂的爬虫攻击和恶意行为威胁。本文将系统性地介绍网站反爬与用户行为检测的技术体系,包括基本原理、防护策略、第三方组件选型以及真实案例分析,帮助开发者构建更加安全…...

      docker安装Prometheus+Grafana

      docker 安装Prometheus 下载镜像 很多镜像服务器都不行了&#xff0c;我用的这个地址还可以 查看可用docker镜像地址&#xff1a;https://cloud.tencent.com/developer/article/2485043 docker pull docker.xuanyuan.me/prom/prometheus:latest启动 docker run -itd --name…...

      解决 Linux Bash 脚本因换行符问题导致的 “bash^M: No such file or directory“ 错误

      一、问题重现 最近在部署一个 Bash 脚本时遇到一个诡异的问题&#xff1a; bash $ chmod x deploy.sh $ ./deploy.sh /usr/bin/env: ‘bash\r’: No such file or directory 明明脚本内容正确&#xff0c;权限也设置好了&#xff0c;为什么会出现这样的错误&#xff1f; 二…...

      DS1302实时时钟模块

      目录 0.单片机定时器时钟的几个缺点&#xff1a; 1.DS1302介绍 2.引脚定义和应用电路 3.原理图 4.内部结果框图&#xff0c;RAM&#xff08;寄存器&#xff09; 5.寄存器定义 6.时序定义 7.DS1302时钟代码 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a…...

      redis的List为什么用ziplist和quicklist

      redis的List为什么用ziplist和quicklist 压缩列表&#xff08;ziplist&#xff09; 是一种节省内存的数据结构&#xff0c;最早是 Redis 中为了减少内存开销而引入的一种顺序存储结构。它不是标准库里的内容&#xff0c;而是某些底层系统&#xff08;比如 Redis&#xff09;在…...

      Java 后端基础 Maven

      Maven 1.什么是Maven 2.Maven的作用 Maven核心 Maven概述 IDEA集成Maven 1.创建Maven项目 点击设置里的 Project Structure 将jdk和编译语言进行设置 随后点击apply点击ok 2.Maven坐标 3.导入Maven项目 将文件夹复制到当前项目的目录下 在这个目录下&#xff0c;在磁盘中…...

      开源情报的发展前景与行业运用

      开源情报系统在实际中的应用正随着技术进步和社会需求的增长而不断拓展&#xff0c;其在国家安全、军事、经济、公共卫生等多个领域展现出显著价值。以下是结合最新动态与案例的综合分析&#xff1a; 一、国家安全&#xff1a;从传统到现代的情报体系升级 开源情报在国家安全…...

      《黑马前端ajax+node.js+webpack+git教程》(笔记)——node.js教程+webpack教程(nodejs教程)

      黑马程序员前端AJAX入门到实战全套教程&#xff0c;包含学前端框架必会的&#xff08;ajaxnode.jswebpackgit&#xff09;&#xff0c;一套全覆盖 文章目录 Node.js与Webpack-01.Node.js入门定义和作用什么是前端工程化&#xff1f;&#xff08;离不开node.js&#xff09;Node.…...

      Canvas设计图片编辑器全讲解(一)Canvas基础(万字图文讲解)

      一、前序 近两年AI发展太过迅速&#xff0c;各类AI产品层出不穷&#xff0c;AI绘图/AI工作流/AI视频等平台的蓬勃发展&#xff0c;促使图片/视频等复杂内容的创作更加简单&#xff0c;让更多普通人有了图片和视频创作的机会。另一方面用户内容消费也逐渐向图片和视频倾斜。在“…...

      disryptor和rabbitmq

      disryptor和rabbitmq Disruptor 是什么&#xff1f; Disruptor 是一个由 LMAX Exchange 开发的高性能、低延迟的进程内&#xff08;in-process&#xff09;并发编程框架/库。它最初是为了解决金融交易系统中高吞吐量、低延迟消息传递的需求而设计的。 核心特点和设计理念&am…...

      java基础-关键字:static、单例模式

      1.例如&#xff1a;我们创造一个人的类&#xff0c;我们希望他是中国人类&#xff0c;所以我们希望所有对象都共有中国人的属性&#xff1b; import org.w3c.dom.ls.LSOutput;import java.sql.Connection; import java.sql.SQLOutput; import java.util.Arrays;public class Ma…...

      深入解析PyTorch中MultiheadAttention的参数key_padding_mask与attn_mask

      1. 基本背景 在multiheadattention中存在两个mask&#xff0c;一个参数是key_padding_mask&#xff0c;另外一个是attn_mask&#xff0c;尽管这两个参数是被人们所熟知的填充掩码和注意力掩码&#xff0c;但是深度理解以便清晰区分对于深刻理解该架构非常重要。 2. 参数Key_p…...

      【Hadoop】--HA高可用搭建--3.2.2

      修改环境配置文件 hadoop-env.sh # 在文件末尾添加以下内容&#xff1a; # java_home记得修改 export JAVA_HOME/usr/java/jdk1.8.0xxxx export HDFS_NAMENODE_USERroot export HDFS_DATANODE_USERroot export HDFS_ZKFC_USERroot export HDFS_JOURNALNODE_USERroot export YA…...

      OpenCv(7.0)——银行卡号识别

      文章目录 前言1.1 模板处理模块读取模板图像并预处理轮廓检测与处理构建数字模板库 1.2 银行卡图像预处理图像尺寸标准化形态学操作二值化与闭操作 1.3 卡号区域定位轮廓筛选逻辑 1.4 数字识别与结果展示完整代码展示总结 前言 本代码实现基于传统图像处理技术&#xff0c;通过…...

      新手怎么样制作网站?

      如果你是没有任何的建站基础&#xff0c;又没有任何的网站管理经验&#xff0c;那么应该如何开展网站制作呢&#xff1f;今天由我给大家分享一下网站制作的步骤和流程&#xff1a; 一、制定网站的核心主题&#xff1a; 在用户开展网站制作的之前&#xff0c;先确定一下以下的内…...

      React集成百度【JSAPI Three】教程(002):设置不同的环境效果

      文章目录 2、设置不同的天气2.1 安装antd前端UI库2.2 是否开启动态天空2.3 创建天气组件2.4 代码2.0版本下载2、设置不同的天气 2.1 安装antd前端UI库 安装命令: npm install antd --save2.2 是否开启动态天空 天气中的阴天、多云需要在开启动态天空后才能有效显示。在页面…...

      Helm Chart 中配置多个 Docker Registry 地址以实现备用访问

      在 Helm Chart 中配置多个 Docker Registry 地址以实现备用访问&#xff0c;可以通过以下几种方式实现&#xff1a; 1. 在 values.yaml 中定义多个 Registry 在 values.yaml 中定义主 Registry 和备用 Registry&#xff0c;以便在部署时灵活切换&#xff1a; # values.yaml …...

      星云智控v1.0.0产品发布会圆满举行:以创新技术重构物联网监控新生态

      星云智控v1.0.0产品发布会圆满举行&#xff1a;以创新技术重构物联网监控新生态 2024年5月15日&#xff0c;成都双流蛟龙社区党群服务中心迎来了一场备受业界瞩目的发布会——优雅草科技旗下”星云智控v1.0.0”物联网AI智控系统正式发布。本次发布会吸引了包括沃尔沃集团、新希…...

      利用ffmpeg截图和生成gif

      ffmpeg -i input.mp4 -ss 00:00:10 -vframes 1 output.jpgffmpeg -i input.mp4 -ss 00:00:10 -vframes 180 output.jpg -vframes 180代表截取180帧, 实测后发现如果视频是60fps,那么会从第10秒截取到第13秒-i input.mp4&#xff1a;指定输入视频文件。-ss 00:00:10&#xff1a;…...

      OpenCV CUDA 模块中的矩阵算术运算-----在频域中执行两个复数频谱的逐元素乘法的函数mulSpectrums()

      操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 mulSpectrums()是OpenCV CUDA 模块中用于在频域中执行两个复数频谱的逐元素乘法的函数。 该函数实现了以下运算&#xff1a; d s t s r c 1 ⋅…...

      可视化图解算法41:搜索二维矩阵(二维数组中的查找)

      1. 题目 牛客网 面试笔试TOP101 | LeetCode 74. 搜索二维矩阵 描述 在一个二维数组array中&#xff08;每个一维数组的长度相同&#xff09;&#xff0c;每一行都按照从左到右递增的顺序排序&#xff0c;每一列都按照从上到下递增的顺序排序。请完成一个函数&#xf…...

      OpenCV CUDA模块中的矩阵算术运算------创建卷积操作对象的工厂方法 cv::cuda::createConvolution

      操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 createConvolution函数是OpenCV CUDA 模块中用于创建卷积操作对象的工厂方法。它返回一个指向 cv::cuda::Convolution 接口的智能指针&#xff0…...

      从代码学习深度学习 - 用于预训练词嵌入的数据集 PyTorch版

      文章目录 前言辅助工具代码绘图工具 (utils\_for\_huitu.py)数据处理工具 (utils\_for\_data.py)读取数据集 (PTB)构建词表下采样高频词中心词和上下文词的提取负采样小批量加载训练实例整合代码:构建数据加载器总结前言 词嵌入(Word Embedding)是将词语映射到低维连续向量…...

      基于jsp+mysql+Spring的Springboot旅游网站管理系统设计和实现

      基于jspmysqlSpring的Springboot旅游网站管理系统设计和实现 &#x1f345; 作者主页 网顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定…...

      【Rust迭代器】Rust迭代器用法解析与应用实战

      ✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…...

      嵌入式学习笔记DAY23(树,哈希表)

      一、树 1.树的概念 之前我们一直在谈的是一对一的线性结构&#xff0c;现实中&#xff0c;还存在很多一对多的情况需要处理&#xff0c;一对多的线性结构——树。 树的结点包括一个数据元素及若干指向其子树的分支&#xff0c;结点拥有的子树数称为结点的度。度为0的结点称为叶…...

      操作系统————五种页面置换算法(OPT,FIFO,LRU,NRU,加强版NRU)大总结

      ❤️❤️❤️算法1&#xff1a;最佳置换算法&#xff08;OPT&#xff09; 算法思想&#xff1a; 值得注意的是这是一种理想型算法&#xff0c;实际上并不可能实现&#xff0c;读者需要注意 下面我们来解析一下它的原理&#xff1a; 我们假设有三个内存块&#xff0c;对于页面…...

      数据结构(二) 线性表

      一. 线性表 1.定义 线性表是由n(n>0)个具有相同数据类型的数据元素构成的有限序列。其中&#xff0c;元素之间通过顺序关系排列&#xff0c;每个元素有且只有一个直接前驱和一个直接后继(除首尾元素外) 二.线性表的顺序表示(顺序表) 1.存储方式 使用连续的内存空间(数组)存储…...

      TS04:高性能四通道自动灵敏度校准电容触摸传感器

      在现代电子设备中&#xff0c;电容触摸传感器的应用越来越广泛&#xff0c;而高性能的传感器芯片是实现良好用户体验的关键。 TS04 四通道电容触摸传感器&#xff0c;凭借其自动灵敏度校准功能和多种特性&#xff0c;成为理想的解决方案。本文将简要介绍 TS04 的主要特性、功能…...

      鸿蒙 系统-安全-程序访问控制-应用权限管控

      Ability Kit 提供了一种允许应用访问系统资源&#xff08;如&#xff1a;通讯录等&#xff09;和系统能力&#xff08;如&#xff1a;访问摄像头、麦克风等&#xff09;的通用权限访问方式&#xff0c;来保护系统数据&#xff08;包括用户个人数据&#xff09;或功能&#xff0…...

      ArcGIS Pro 3.4 二次开发 - 框架

      环境&#xff1a;ArcGIS Pro SDK 3.4 .NET 8 文章目录 框架1 框架1.1 如何在 DockPane 可见或隐藏时订阅和取消订阅事件1.2 执行命令1.3 设置当前工具1.4 激活选项卡1.5 激活/停用状态 - 修改条件1.6 判断应用程序是否繁忙1.7 获取应用程序主窗口1.8 关闭 ArcGIS Pro1.9 获取 …...

      打破传统仓库管理困局:WMS如何重构出入库全流程

      引言 在制造业与零售业高速发展的今天&#xff0c;仓库管理仍普遍面临效率低、错发漏发频发、库存数据滞后等痛点。人工登记导致30%的错单率&#xff0c;货位混乱让拣货耗时增加50%&#xff0c;而账实不符引发的二次采购成本更吞噬着企业利润。如何突破传统管理桎梏&#xff1…...

      npm 安装时 SSL 证书过期问题笔记

      问题描述: npm error code CERT_HAS_EXPIRED npm error errno CERT_HAS_EXPIRED npm error request to https://registry.npm.taobao.org/axios failed, reason: certificate has expired 这表明当前配置的 npm 镜像源&#xff08;淘宝镜像 https://registry.npm.taobao.org&…...

      【大数据】MapReduce 编程-- PageRank--网页排名算法,用于衡量网页“重要性”-排序网页

      PageRank 是 Google 创始人拉里佩奇&#xff08;Larry Page&#xff09;和谢尔盖布林&#xff08;Sergey Brin&#xff09;在 1998 年提出的一种网页排名算法&#xff0c;用于衡量网页“重要性”的一种方式。它是搜索引擎中用于排序网页的一种基础算法 一个网页越是被其他重要…...

      Craw4AI:LLM友好的网页爬虫

      GitHub&#xff1a;https://github.com/unclecode/crawl4ai 更多AI开源软件&#xff1a;发现分享好用的AI工具、AI开源软件、AI模型、AI变现 - 小众AI Crawl4AI旨在让网页爬取和数据提取变得简单而高效。无论构建复杂的 AI 应用程序还是增强大语言模型&#xff0c;Crawl4AI 都能…...

      idea 安装飞算-javaAI 插件使用

      文章目录 前言idea 安装飞算-javaAI 插件使用1. 介绍一下飞算-AI2. 安装使用 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的…...

      Lombok

      Lombok Lombok 是一个 Java 库&#xff0c;通过注解自动生成样板代码&#xff08;如 Getter/Setter、构造函数等&#xff09;&#xff0c;从而简化开发。在你提供的代码中&#xff0c;AllArgsConstructor 就是一个 Lombok 注解。以下是 Lombok 常用注解及其作用的详细说明&…...

      起点与破圈

      写了多年代码&#xff0c;我为什么开始转向算法&#xff0c;直到如今投身于大模型领域&#xff1f; 作为一名拥有 10 年经验的开发者&#xff0c;我的职业路径几乎覆盖了技术发展的多个阶段。从最早使用 Flask/Django 开发网站&#xff0c;到后来构建大数据系统、设计服务器架…...

      基于AI的Web数据管道,使用n8n、Scrapeless和Claude

      引言 在当今数据驱动的环境中&#xff0c;组织需要高效的方法来提取、处理和分析网络内容。传统的网络抓取面临着诸多挑战&#xff1a;反机器人保护、复杂的JavaScript渲染以及持续的维护需求。此外&#xff0c;理解非结构化的网络数据则需要复杂的处理能力。 本指南演示了如…...

      7GB显存如何部署bf16精度的DeepSeek-R1 70B大模型?

      构建RAG混合开发---PythonAIJavaEEVue.js前端的实践-CSDN博客 服务容错治理框架resilience4j&sentinel基础应用---微服务的限流/熔断/降级解决方案-CSDN博客 conda管理python环境-CSDN博客 快速搭建对象存储服务 - Minio&#xff0c;并解决临时地址暴露ip、短链接请求改…...

      初识函数------了解函数的定义、函数的参数、函数的返回值、说明文档的书写、函数的嵌套使用、变量的作用域(全局变量与局部变量)

      文章目录 一、什么是函数&#xff1f;二、函数定义与调用2.1 基本语法2.2 示例演示 三、函数参数详解3.1 位置参数3.2 默认参数3.3 可变参数3.4 关键字参数 四、返回值与文档说明4.1 返回多个值4.2 编写文档字符串 五、函数嵌套与作用域5.1 嵌套函数示例5.2 变量作用域5.3 glob…...

      Java常见API文档(下)

      格式化的时间形式的常用模式对应关系如下&#xff1a; 空参构造创造simdateformate对象&#xff0c;默认格式 练习.按照指定格式展示 package kl002;import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date;public class Date3 {publi…...

      ubuntu 20.04 ping baidu.coom可以通,ping www.baidu.com不通 【DNS出现问题】解决方案

      ping baidu.coom可以通&#xff0c;ping www.baidu.com不通【DNS出现问题】解决方案 检查IPV6是否有问题 # 1. 检查 IPv6 地址&#xff0c;记住网络接口的名称 ip -6 addr show# 2. 测试本地 IPv6&#xff0c;eth0换成自己的网络接口名称 ping6 ff02::1%eth0# 3. 检查路由 ip…...

      Oracle 中 open_cursors 参数详解:原理、配置与性能测试

      #Oracle #参数 # open_cursors #ORA-01000 在 Oracle 数据库的众多参数中&#xff0c;open_cursors是一个对应用程序性能和资源管理有着重要影响的参数。它直接关系到数据库与应用程序之间游标资源的使用与分配&#xff0c;合理配置open_cursors参数&#xff0c;能够避免应用程…...

      线程调度与单例模式:wait、notify与懒汉模式解析

      一.wait 和 notify&#xff08;等待 和 通知&#xff09; 引入 wait notify 就是为了能够从应用层面&#xff0c;干预到多个不同线程代码的执行顺序&#xff0c;可以让后执行的线程主动放弃被调度的机会&#xff0c;等先执行的线程完成后通知放弃调度的线程重新执行。 自助取…...

      AGI大模型(27):LangChain向量存储

      1 安装依赖 使用一个简单的本地向量存储 FAISS,首先需要安装它 pip install faiss-cpu -i https://pypi.tuna.tsinghua.edu.cn/simple pip install langchain_community==0.3.7 -i https://pypi.tuna.tsinghua.edu.cn/simple 由于演示过程中用到了爬虫,需要安装依赖库,如…...