Spring Boot Web技术栈(官网文档解读)
摘要
Spring Boot框架既支持传统的Servlet技术栈,也支持新兴的响应式(Reactive)技术栈。本篇文章将详细讲述Spring Boot 对两种技术栈的详细支持和使用。
Servlet
概述
基于Java Servlet API构建,它依赖于传统的阻塞I/O模型,每个HTTP请求都会分配一个线程来处理,直到响应返回给客户端。这种模型适用于大多数传统的Web应用,其中大部分操作是同步的,并且涉及到数据库查询或文件读写等I/O密集型任务。
-
特点
-
同步编程模型:代码按照顺序执行,等待每个操作完成后再继续下一个操作。
-
线程池机制:使用线程池管理请求处理线程,但当并发用户数增加时,可能会导致资源耗尽问题。
-
成熟的生态系统:拥有丰富的库和框架支持(如Spring MVC),并且已经被广泛应用于企业级应用中。
-
-
适用场景:适合那些对实时性和高并发要求不是特别高的应用场景,尤其是当业务逻辑较为复杂或者需要大量的数据处理时。
Spring Boot 对Servlet技术栈的实现架构
Spring MVC
简介
Spring MVC 是 Spring Framework 的核心组件之一,专为构建基于 Servlet 技术的 Web 应用程序而设计。Spring Boot 整合了 Spring MVC 框架,以此提供对传统 Web Servlet 技术栈的全面支持,使得开发者能够便捷地构建和运行基于 Servlet 的 Web 应用。
实现方式
添加依赖Spring-boot-starter-web。Spring Boot 默认使用Servlet 技术栈的Spring MVC 架构。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
官网提供了两种实现Spring MVC 架构的示例。第一种是常见的采用 @Controller 或 @RestController 注解的实现方式。
package person.wend.springbootlearnexample.controller;import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/users")
public class MyRestController {@GetMapping("/{userId}")public void getUser(@PathVariable Long userId) {System.out.println("userId = " + userId);}@GetMapping("/{userId}/customers")public void getUserCustomers(@PathVariable Long userId) {System.out.println("userId = " + userId);}@DeleteMapping("/{userId}")public void deleteUser(@PathVariable Long userId) {System.out.println("userId = " + userId);}}
第二种是基于函数式编程的初始化配置路由的方式。
package person.wend.springbootlearnexample.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.function.RequestPredicate;
import org.springframework.web.servlet.function.RouterFunction;
import org.springframework.web.servlet.function.ServerResponse;import static org.springframework.web.servlet.function.RequestPredicates.accept;
import static org.springframework.web.servlet.function.RouterFunctions.route;@Configuration(proxyBeanMethods = false)
public class MyRountingConfig {private static final RequestPredicate ACCEPT_JSON = accept(MediaType.APPLICATION_JSON);@Beanpublic RouterFunction<ServerResponse> routerFunction(MyUserHandler userHandler) {return route().GET("/{user}", ACCEPT_JSON, userHandler::getUser).GET("/{user}/customers", ACCEPT_JSON, userHandler::getUserCustomers).DELETE("/{user}", ACCEPT_JSON, userHandler::deleteUser).build();}
}
package person.wend.springbootlearnexample.config;import org.springframework.stereotype.Component;
import org.springframework.web.servlet.function.ServerRequest;
import org.springframework.web.servlet.function.ServerResponse;@Component
public class MyUserHandler {public ServerResponse getUser(ServerRequest request) {System.out.println("request = " + request);return ServerResponse.ok().body("getUser");}public ServerResponse getUserCustomers(ServerRequest request) {System.out.println("request = " + request);return ServerResponse.ok().body("getUserCustomers");}public ServerResponse deleteUser(ServerRequest request) {System.out.println("request = " + request);return ServerResponse.ok().body("deleteUser");}}
自动装配Spring MVC
Spring Boot 为 Spring MVC 提供了自动配置功能,该功能适用于大多数应用程序。它取代了对 @EnableWebMvc 的需求,并且两者不能同时使用。除了 Spring MVC 的默认配置之外,自动配置还提供了以下特性:
-
视图解析器相关:包含了 ContentNegotiatingViewResolver 和 BeanNameViewResolver 这两个 Bean。ContentNegotiatingViewResolver 可以根据请求的媒体类型(如 Accept 头信息)和可提供的视图,来决定使用哪个视图进行响应。而 BeanNameViewResolver 会根据视图名称来查找相应的 Bean 作为视图,例如,如果视图名称是 “myView”,它会查找名为 “myView” 的 Bean 作为视图进行渲染。
-
静态资源服务:支持提供静态资源服务,其中包括对 WebJars 的支持。WebJars 是一种将前端库(如 jQuery、Bootstrap 等)打包成 JAR 文件的方式,这样可以方便地将它们作为依赖添加到 Java 项目中,并且 Spring Boot 会自动将其作为静态资源进行处理,使得前端资源的管理更加方便。
-
转换器、通用转换器和格式化器的自动注册:会自动注册 Converter、GenericConverter 和 Formatter 这些 Bean。Converter 可用于将一种数据类型转换为另一种数据类型,例如将字符串转换为日期类型;GenericConverter 是一种更通用的转换机制,提供了更灵活的转换方式;Formatter 则侧重于对数据进行格式化操作,比如将日期对象格式化为特定的字符串形式,方便在视图中显示,它们的自动注册可以简化开发过程,减少手动配置的工作量。
-
HttpMessageConverters 的支持:支持 HttpMessageConverters。HttpMessageConverters 用于将 HTTP 请求或响应中的数据在 Java 对象和 HTTP 消息体之间进行转换。例如,将 Java 对象转换为 JSON 或 XML 格式并发送到客户端,或者将客户端发送的 JSON 或 XML 数据转换为 Java 对象,这对于处理 RESTful API 非常重要。
-
MessageCodesResolver 的自动注册:自动注册 MessageCodesResolver。MessageCodesResolver 通常用于生成和解析消息代码,在进行数据校验等场景中,它可以根据错误信息生成特定的消息代码,以便更好地处理错误信息,使应用程序可以根据消息代码进行不同的错误处理操作。
-
静态 index.html 支持:支持静态的 index.html 文件。这意味着如果在静态资源目录下存在 index.html 文件,当用户访问应用程序的根路径时,Spring Boot 会直接提供该文件作为响应,方便进行静态页面的展示,这对于一些单页应用程序(SPA)或者静态站点的部署非常有用。
-
自动使用 ConfigurableWebBindingInitializer Bean:自动使用 ConfigurableWebBindingInitializer Bean(本文后续会提及)。这个 Bean 可以对 Web 请求参数绑定进行初始化操作,例如可以设置数据绑定的日期格式、绑定过程中忽略的字段等,确保请求参数可以正确地绑定到 Java 对象上。
如果您想要保留 Spring Boot 的这些 MVC 自定义特性,并进行更多的 MVC 自定义操作(如拦截器、格式化器、视图控制器以及其他功能),您可以添加自己的 @Configuration 类,其类型为 WebMvcConfigurer,但不要使用 @EnableWebMvc。
如果您想要提供 RequestMappingHandlerMapping、RequestMappingHandlerAdapter 或 ExceptionHandlerExceptionResolver 的自定义实例,同时又想保留 Spring Boot 的 MVC 自定义特性,可以声明一个类型为 WebMvcRegistrations 的 Bean,并使用它来提供这些组件的自定义实例。这些自定义实例将接受 Spring MVC 的进一步初始化和配置。如果您想参与并在需要时覆盖后续的处理过程,可以使用 WebMvcConfigurer。
如果您不想使用自动配置,并且想要完全掌控 Spring MVC,可以添加自己的、带有 @EnableWebMvc 注解的 @Configuration 类。或者,按照 @EnableWebMvc 的 API 文档中描述的那样,添加自己的带有 @Configuration 注解的 DelegatingWebMvcConfiguration。
Jersey
Jersey 是一个开源的、用于构建 RESTful Web 服务的框架,它是 Java API for RESTful Web Services(JAX-RS)的参考实现。它提供了一组强大的工具和 API,使开发人员能够轻松地创建、部署和管理 RESTful 服务。
Spring Boot 集成 Jersey
添加依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jersey</artifactId>
</dependency>
注册端点
package person.wend.springbootlearnexample.config;import org.glassfish.jersey.server.ResourceConfig;
import org.springframework.stereotype.Component;
import person.wend.springbootlearnexample.controller.JerseyController;
import person.wend.springbootlearnexample.controller.UserJerseyController;@Component
public class MyJerseyConfig extends ResourceConfig {public MyJerseyConfig() {register(JerseyController.class);register(UserJerseyController.class);}
}
Jersey 基于 JAX-RS 标准
Jersey 遵循 JAX-RS 规范,这意味着它提供了标准的注解和 API 来开发 RESTful Web 服务。例如,使用 @Path
注解来定义资源的 URI 路径,@GET
、@POST
、@PUT
、@DELETE
等注解来定义 HTTP 方法。以下是一个简单的示例:
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;@Path("/hello")
public class HelloResource {@GET@Produces(MediaType.TEXT_PLAIN)public String sayHello() {return "Hello, World!";}
}
在上述代码中:
-
@Path("/hello")
定义了资源的 URI 路径为/hello
。 -
@GET
表示这个方法将处理 HTTP 的 GET 请求。 -
@Produces(MediaType.TEXT_PLAIN)
表示该方法将产生纯文本类型的响应。
强大的请求和响应处理
Jersey 支持多种媒体类型的请求和响应处理,包括 JSON、XML、HTML、纯文本等。通过 @Consumes
和 @Produces
注解可以指定请求和响应的数据类型。例如:
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;@Path("/user")
public class UserResource {@GET@Produces(MediaType.APPLICATION_JSON)public User getUser() {User user = new User("John", 30);return user;}@POST@Consumes(MediaType.APPLICATION_JSON)@Produces(MediaType.APPLICATION_JSON)public Response createUser(User user) {// 处理用户创建逻辑return Response.status(Response.Status.CREATED).entity(user).build();}
}
-
@Consumes(MediaType.APPLICATION_JSON)
表示createUser
方法接受 JSON 类型的请求体。 -
@Produces(MediaType.APPLICATION_JSON)
表示该方法将返回 JSON 类型的响应。
Spring Boot 对Servlet 技术栈的嵌入式容器支持
当您希望采用传统的Servlet栈来构建应用时,您需要添加spring-boot-starter-web
依赖,该依赖默认集成了spring-boot-starter-tomcat
,意味着您的应用将使用Tomcat作为Web容器。此外,Spring Boot还支持使用Jetty和Undertow作为可选的Web容器。
Spring Boot 替换容器示例
以下是一个使用jetty 替换默认的tomcat 的Maven 依赖配置示例。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><!-- Exclude the Tomcat dependency --><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions>
</dependency>
<!-- Use Jetty instead -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
Reactive
概述
Reactive 引入了非阻塞I/O模型和事件驱动架构,旨在提高系统的可伸缩性和响应能力。它允许应用程序以异步方式处理请求,从而可以在更少的线程上处理更多的并发连接。这使得Reactive Stack非常适合构建微服务架构下的高性能Web服务。
-
特点
-
异步编程模型:采用回调函数或观察者模式实现异步操作,避免了长时间等待资源释放的问题。
-
背压机制:通过Reactive Streams规范提供流控能力,确保上游不会过快地发送数据给下游,造成系统过载。
-
轻量级线程:利用协程(Coroutines)或其他轻量级线程替代传统线程,降低了上下文切换开销。
-
现代Web容器:通常运行在像Netty这样的非阻塞服务器上,也可以兼容Servlet 3.1+容器。
-
-
适用场景:特别适用于需要处理大量并发连接、低延迟要求的应用程序,例如实时聊天室、物联网平台、在线游戏等。
实现方式
-
添加依赖:我们需要引入 spring-boot-starter-webflux依赖以支持响应式Web 编程。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
-
依赖冲突问题 :需要注意的是,当我们在应用程序中同时添加了
spring-boot-starter-web
和spring-boot-starter-webflux
模块的依赖时, Spring Boot 会选择自动配置 Spring MVC,而不是 WebFlux。 -
如果项目中同时存在两个依赖,但是我们仍然想使用Webflux 架构,我们可以将所选应用程序类型设置为 SpringApplication.setWebApplicationType(WebApplicationType.REACTIVE) 来强制使用webflux 模块。
@SpringBootApplication
public class SpringBootLearnExampleApplication {public static void main(String[] args) {SpringApplication springApplication = new SpringApplication(SpringBootLearnExampleApplication.class);// 将应用设置为响应式应用springApplication.setWebApplicationType(WebApplicationType.REACTIVE);SpringApplication.run(SpringBootLearnExampleApplication.class, args);}}
-
Spring webFlux 的代码实现有两种方式,基于注释的和函数式编程,两种方式的实现代码与Spring MVC 架构的实现代码基本一致,只不过内部实现原理不同,WebFlux 的函数式是基于WebFlux.fn,而Spring MVC的函数式是基于WebMvc.fn。代码示例请参考上述Spring MVC 的代码实现示例。
Spring WebFlux 自动装配
Spring WebFlux的自动装配与 Spring MVC 的自动装配过程和功能均保持一致,需要注意的是关于WebFlux 自定义注解与MVC 框架不一致。比如如果您希望保留 Spring Boot 对 WebFlux 的这些自定义设置,同时进行更多的 WebFlux 自定义配置(如添加拦截器、自定义格式化器、设置视图控制器等其他功能),可以添加自定义的 @Configuration
类,使其实现 WebFluxConfigurer
接口,但不要使用 @EnableWebFlux
注解。
Spring Boot 对Reactive 技术栈的嵌入式容器支持
WebFlux默认采用Netty作为其网络通信框架。不过,您也可以选择配置Tomcat、Jetty或Undertow来替代Netty作为WebFlux的底层传输层。
Servlet Stack 与 Reactive Stack 比较
特性 | Servlet Stack | Reactive Stack |
---|---|---|
编程模型 | 同步 | 异步 |
线程管理 | 线程池 | 轻量级线程/协程 |
I/O模型 | 阻塞I/O | 非阻塞I/O |
性能优化 | 适用于中等规模并发 | 适用于大规模并发 |
生态系统 | 成熟稳定 | 相对年轻 |
Web容器 | Servlet容器(如Tomcat, Jetty) | 非阻塞服务器(如Netty) |
数据流处理 | 可以实现但较为复杂 | 内置支持 |
示例框架 | Spring MVC,Jersey | Spring WebFlux |
优雅关机
默认情况下,所有四个嵌入式 Web 服务器(Jetty、Reactor Netty、Tomcat 和 Undertow)以及反应式和基于 servlet 的 Web 应用程序均启用了优雅关闭。优雅关闭是关闭应用程序上下文的一部分,在停止SmartLifecyclebean 的最早阶段执行。此停止处理使用超时,提供宽限期,在此期间允许完成现有请求,但不允许新请求。
要配置超时时间,请配置spring.lifecycle.timeout-per-shutdown-phase
属性,如以下示例所示:
spring.lifecycle.timeout-per-shutdown-phase=20s
在宽限期内拒绝请求
不允许新请求的具体方式取决于所使用的 Web 服务器。实现可能会在网络层停止接受请求,或者它们可能会返回带有特定 HTTP 状态代码或 HTTP 标头的响应。使用持久连接也可以改变停止接受请求的方式。Jetty、Reactor Netty 和 Tomcat 将停止在网络层接受新请求。Undertow 将接受新连接,但会立即响应服务不可用 (503)。以下是四种Web 服务器的优雅关闭API 接口详情:
TomcatWebServer (Spring Boot 3.4.1 API)
NettyWebServer (Spring Boot 3.4.1 API)
JettyWebServer (Spring Boot 3.4.1 API)
UndertowWebServer (Spring Boot 3.4.1 API)
禁用优雅关机
server.shutdown=immediate
参考文献
Servlet Web Applications :: Spring Boot
相关文章:
Spring Boot Web技术栈(官网文档解读)
摘要 Spring Boot框架既支持传统的Servlet技术栈,也支持新兴的响应式(Reactive)技术栈。本篇文章将详细讲述Spring Boot 对两种技术栈的详细支持和使用。 Servlet 概述 基于Java Servlet API构建,它依赖于传统的阻塞I/O模型&…...
【llama_factory】qwen2_vl训练与批量推理
训练llama factory配置文件 文件:examples/train_lora/qwen2vl_lora_sft.yaml ### model model_name_or_path: qwen2_vl/model_72b trust_remote_code: true### method stage: sft do_train: true finetuning_type: lora lora_target: all### dataset dataset: ca…...
wpa_cli命令使用记录
wpa_cli可以用于查询当前状态、更改配置、触发事件和请求交互式用户输入。具体来说,它可以显示当前的认证状态、选择的安全模式、dot11和dot1x MIB等,并可以配置一些变量,如EAPOL状态机参数。此外,wpa_cli还可以触发重新关联和IEE…...

【Uniapp-Vue3】页面生命周期onLoad和onReady
一、onLoad函数 onLoad在页面载入时触发,多用于页面跳转时进行参数传递。 我们在跳转的时候传递参数name和age: 接受参数: import {onLoad} from "dcloudio/uni-app"; onLoad((e)>{...}) 二、onReady函数 页面生命周期函数中的onReady其…...

《C++11》并发库:简介与应用
在C11之前,C并没有提供原生的并发支持。开发者通常需要依赖于操作系统的API(如Windows的CreateThread或POSIX的pthread_create)或者第三方库(如Boost.Thread)来创建和管理线程。这些方式存在以下几个问题: …...

LeetCode - #183 Swift 实现查询未下订单的客户
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...

HTML拖拽功能(纯html5+JS实现)
1、HTML拖拽--单元行拖动 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><…...

mysql 等保处理,设置wait_timeout引发的问题
👨⚕ 主页: gis分享者 👨⚕ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕ 收录于专栏:运维工程师 文章目录 前言问题处理 前言 系统部署完成后,客户需要做二级等保&…...

7.STM32F407ZGT6-RTC
参考: 1.正点原子 前言: RTC实时时钟是很基本的外设,用来记录绝对时间。做个总结,达到: 1.学习RTC的原理和概念。 2.通过STM32CubeMX快速配置RTC。 27.1 RTC 时钟简介 STM32F407 的实时时钟(RTC…...

重写(补充)
大家好,今天我们把剩下一点重写内容说完,来看。 [重写的设计规则] 对于已经投入使用的类,尽量不要进行修政 ,最好的方式是:重新定义一个新的类,来重复利用其中共性的内容 我们不该在原来的类上进行修改,因为原来的类,可能还有用…...

30分钟内搭建一个全能轻量级springboot 3.4 + 脚手架 <3>5分钟集成好druid并使用druid自带监控工具监控sql请求
快速导航 快速导航 <1> 5分钟快速创建一个springboot web项目 <2> 5分钟集成好最新版本的开源swagger ui,并使用ui操作调用接口 <3> 5分钟集成好druid并使用druid自带监控工具监控sql请求 <4> 5分钟集成好mybatisplus并使用mybatisplus g…...

【C#深度学习之路】如何使用C#实现Yolo8/11 Segment 全尺寸模型的训练和推理
【C#深度学习之路】如何使用C#实现Yolo8/11 Segment 全尺寸模型的训练和推理 项目背景项目实现推理过程训练过程 项目展望写在最后项目下载链接 本文为原创文章,若需要转载,请注明出处。 原文地址:https://blog.csdn.net/qq_30270773/article…...

Oracle 分区索引简介
目录 一. 什么是分区索引二. 分区索引的种类2.1 局部分区索引(Local Partitioned Index)2.2 全局分区索引(Global Partitioned Index) 三. 分区索引的创建四. 分区索引查看4.1 USER_IND_COLUMNS 表4.2 USER_INDEXES 表 五. 分区索…...

【科技赋能未来】NDT2025第三届新能源数字科技大会全面启动!
随着我国碳达峰目标、碳中和目标的提出,以及经济社会的发展进步,以风电、光伏发电为代表的新能源行业迎来巨大发展机遇,成为未来绿色经济发展的主要趋势和方向。 此外,数字化技术的不断发展和创新,其在新能源领域的应…...

Broker收到消息之后如何存储
1.前言 此文章是在儒猿课程中的学习笔记,感兴趣的想看原来的课程可以去咨询儒猿课堂《从0开始带你成为RocketMQ高手》,我本人觉得这个作者还是不错,都是从场景来进行分析,感觉还是挺适合我这种小白的。这块主要都是我自己的学习笔…...

Mysql--实战篇--SQL优化(查询优化器,常用的SQL优化方法,执行计划EXPLAIN,Mysql性能调优,慢日志开启和分析等)
一、查询优化 1、查询优化器 (Query Optimizer) MySQL查询优化器(Query Optimizer)是MySQL数据库管理系统中的一个关键组件,负责分析和选择最有效的执行计划来执行SQL查询。查询优化器的目标是尽可能减少查询的执行时间和资源消耗ÿ…...

BERT与CNN结合实现糖尿病相关医学问题多分类模型
完整源码项目包获取→点击文章末尾名片! 使用HuggingFace开发的Transformers库,使用BERT模型实现中文文本分类(二分类或多分类) 首先直接利用transformer.models.bert.BertForSequenceClassification()实现文本分类 然后手动实现B…...

rabbitmqp安装延迟队列
在RabbitMQ中,延迟队列是一种特殊的队列类型。当消息被发送到此类队列后,不会立即投递给消费者,而是会等待预设的一段时间,待延迟期满后才进行投递。这种队列在多种场景下都极具价值,比如可用于处理需要在特定时间触发…...

深入探讨DICOM医学影像中的MPPS服务及其具体实现
深入探讨DICOM医学影像中的MPPS服务及其具体实现 1. 引言 在医疗影像的管理和传输过程中,DICOM(数字影像和通信医学)标准发挥着至关重要的作用。除了DICOM影像的存储和传输(如影像存储SCP和影像传输SCP),…...
集合帖:区间问题
一、AcWing 803:区间合并 (1)题目来源:https://www.acwing.com/problem/content/805/ (2)算法代码:https://blog.csdn.net/hnjzsyjyj/article/details/145067059 #include <bits/stdc.h>…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...

自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...

论文阅读:Matting by Generation
今天介绍一篇关于 matting 抠图的文章,抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法,已经有很多的工作和这个任务相关。这两年 diffusion 模型很火,大家又开始用 diffusion 模型做各种 CV 任务了&am…...