Spring Boot 概要(官网文档解读)
Spring Boot 概述
Spring Boot 是一个高效构建 Spring 生产级应用的脚手架工具,它简化了基于 Spring 框架的开发过程。 Spring Boot 也是一个“构件组装门户”,何为构件组装门户呢?所谓的“构件组装门户”指的是一个对外提供的Web平台,它允许开发者基于平台方便地选择和集成各种软件构件,以快速构建完整的软件系统。
Spring Boot 在我看来是Java开发者实现CBSE的便捷手段。基于构件的软件工程(CBSE)是一种基于分布对象技术、强调通过可复用构件设计与构造软件系统的软件复用途径。而Spring Boot 正是这样一个工具,它帮助开发者迅速挑选合适的构件,并将它们组装成一个可以直接运行的 Spring Boot 应用。
Spring Boot 提供的可选取的构件主要包括:
-
项目构建工具集成:支持 Maven 和 Gradle,便于项目的构建和管理。
-
嵌入式Web服务器集成:默认集成 Tomcat,但也支持替换为 Jetty 或 Undertow,以适应不同的部署需求。
-
Spring 框架内 Starters:一系列基于 Spring 框架的预配置依赖项,通过 Spring-Boot-Starter 方式集成,简化了依赖管理。
-
三方库中的的 Starters:第三方开源项目(如 Druid)提供的 Starters,它们遵循 Spring Boot 的集成规范,使得在 Spring Boot 应用中集成这些项目变得简单。
-
其它依赖项:支持 Maven 仓库中的各种依赖,以及用户可以通过构建工具自行导入来自不同平台,或是自己项目的依赖。
-
开发者工具(DevTools):Spring Boot 提供了一套开发者工具,这些工具旨在提升开发效率,包括热重载和自动重启等功能,以便更快速地开发 Spring Boot 应用。
Spring Boot 门户
Spring Boot 官方提供的快速构建门户网站是 https://start.spring.io/。通常,在使用 IDE 创建 Spring Boot 项目时,实际上也是调用了该网站的 API 来实现 Spring Boot 应用的快速搭建。
图1 Spring Boot 门户网站
阿里云Spring Boot
图2 阿里云云原生应用脚手架
国内互联网巨头阿里云也提供了一个类似于 Spring Boot 的门户网站,即 https://start.aliyun.com/,称为云原生应用脚手架。对于偏好使用阿里巴巴技术解决方案的开发者来说,可以将 Spring Boot 的官方门户替换为阿里云提供的这个门户网站,以便更便捷地构建符合国内技术生态的应用。
阿里云Spring Boot 替换方式(Idea)
图3 IDEA 中设置Spring Boot 门户网站
在IDEA 中 new Project ,选择Spring Initializr,点击Server URL旁边的配置按钮,就可以将默认的 start.spring.io 替换为 start.aliyun.com 了。
Spring Boot 核心价值
图4 Spring Boot 核心价值
基于官网对 Spring Boot 核心价值的描述,结合个人理解,以下是对其核心要点的优化总结:
-
Spring Boot 简化使用Spring框架的难度,提供一个更快速,更简便的构建Spring框架的方式
-
开箱即用,同时允许开发者根据具体项目需求调整默认配置,以适配更合适的设置
-
Spring Boot 框架内置了多种非功能性特性,如嵌入式服务器(如 Tomcat)、安全性、监控指标、健康检查和外部配置等
-
Spring Boot免去了手动代码生成(使用门户网站配置的方式生成Spring Boot 项目框架)和传统 Spring 应用中所需的 XML 配置
Spring Boot 架构图
图5 Spring Boot 功能架构图
如图5所示的Spring Boot功能架构图展示,Spring Boot首先通过其提供的门户网站,为用户简化了配置Spring Boot框架的过程。通过这个门户网站,用户能够方便地选择合适的构建工具,如Maven或Gradle。Spring Boot支持Java、Groovy和Kotlin三种开发语言,这三种语言以及Spring Boot 项目本身均基于JDK,因此用户需要在门户网站上指定JDK的版本。该图还概述了Spring Boot框架的核心功能,我将在下文中详细展开介绍。
在功能架构图的右侧,展示了Spring Boot基于Starters的快速配置项目,它包含了如图所示的不同分类,每个分类下都有多种可选构件。在后续文章中,我将重点介绍基于Spring框架的构件。当然,用户也可以利用构建工具自行选择和添加所需的依赖库。
Spring Boot 核心组件
Spring Boot Starters
Starters 是一组方便的依赖项描述符,您可以将其包含在应用程序中。您可以一站式获取所需的所有 Spring 和相关技术,而无需搜索示例代码和复制粘贴大量依赖项描述符。Spring Boot 中集成的Starter的内容非常简单,通常只包含一个build.gradle文件。我将拿其中的 spring-boot-starter 举例,让我们一起了解下Sping Boot 中 的 starter 配置。
plugins {id "org.springframework.boot.starter"
}description = "Core starter, including auto-configuration support, logging and YAML"dependencies {api(project(":spring-boot-project:spring-boot"))api(project(":spring-boot-project:spring-boot-autoconfigure"))api(project(":spring-boot-project:spring-boot-starters:spring-boot-starter-logging"))api("jakarta.annotation:jakarta.annotation-api")api("org.springframework:spring-core")api("org.yaml:snakeyaml")
}
plugins 中的 org.springframework.boot.starter 是Spring Boot 中自定义的插件。
如图所示,我们可以看到 org.springframework.boot.starter 的实现类是 org.springframework.boot.build.starters.StarterPlugin。这个插件的主要目的是为Spring Boot starters提供一套标准化的构建和质量检查流程,包括但不限于元数据的生成、类路径冲突的检测、依赖关系的检查以及JAR文件清单的定制。
build.gradle 文件的 dependencies 中则定义了 spring-boot-starter 包含的所有依赖。用户后续在使用 spring-boot 的时候,只需要引入spring-boot-starter,而不需要再引入其它的相关依赖,因为 spring-boot-starter包含了这些依赖。这也是starter 的主要作用。
starter 命名规则
-
官方Starter:Spring-Boot 官方的Starter 都统一以 spring-boot-starter-* 格式命名,其中
*
是特定类型的应用程序。此命名结构旨在帮助您在需要查找启动器时使用。许多 IDE 中的 Maven 集成允许您按名称搜索依赖项。例如,安装了适当的 Eclipse 或 Spring Tools 插件后,您可以按ctrl-space
POM 编辑器并键入“spring-boot-starter”以获取完整列表。 -
三方库或自建Starter:第三方启动器不应以
spring-boot
开头,因为它是为官方 Spring Boot 工件保留的。通常正确的写法是,名为thirdpartyproject
的第三方启动器项目,通常其定义的Starter应命名为thirdpartyproject-spring-boot-starter
。
Spring Boot Web技术栈
Spring Boot Web技术栈(官网文档解读)_springboot的技术栈-CSDN博客
Spring Boot Actuator
Spring Boot Actuator(官网文档解读)-CSDN博客
Spring Boot Actuator EndPoints(官网文档解读)-CSDN博客
Spring Boot Actuator 集成 Micrometer(官网文档解读)_spring actuator micrometer-CSDN博客
Spring Boot devtools
Spring Boot DevTools(官网文档解读)_springboot devtool-CSDN博客
Spring Boot 核心功能
Spring Boot 应用
Spring Boot 配置
Spring Boot 配置(官网文档解读)_springboot官方文档-CSDN博客
国际化支持
Spring Boot 对国际化(i18n)提供了良好的支持,允许开发者根据用户的语言环境展示不同的文本信息,以满足全球用户的需求。
配置国际化资源文件
首先,需要在 src/main/resources
目录下创建 messages
资源文件,用于存储不同语言环境的文本信息。资源文件的命名规则为 messages_<语言代码>_<国家代码>.properties
,例如:
-
messages.properties
:默认的资源文件,当没有匹配到特定语言环境时使用。 -
messages_en_US.properties
:英语(美国)的资源文件。 -
messages_zh_CN.properties
:中文(中国)的资源文件。
配置国际化解析器
在 Spring Boot 中,可以通过配置 LocaleResolver
和 MessageSource
来实现国际化支持。可以创建一个配置类来完成这些配置:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;import java.util.Locale;@Configuration
public class WebConfig implements WebMvcConfigurer {@Beanpublic LocaleResolver localeResolver() {SessionLocaleResolver slr = new SessionLocaleResolver();slr.setDefaultLocale(Locale.US); // 设置默认语言环境return slr;}@Beanpublic LocaleChangeInterceptor localeChangeInterceptor() {LocaleChangeInterceptor lci = new LocaleChangeInterceptor();lci.setParamName("lang"); // 设置切换语言的请求参数名return lci;}@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(localeChangeInterceptor());}@Beanpublic ResourceBundleMessageSource messageSource() {ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();messageSource.setBasename("messages"); // 设置资源文件的基础名称messageSource.setDefaultEncoding("UTF-8"); // 设置编码return messageSource;}
}
-
LocaleResolver
:用于确定当前用户的语言环境,这里使用SessionLocaleResolver
将语言环境信息存储在会话中。 -
LocaleChangeInterceptor
:用于拦截请求,根据请求参数(这里是lang
)来切换语言环境。 -
ResourceBundleMessageSource
:用于加载和管理国际化资源文件。
JSON 支持
Spring Boot 提供了三个JSON 映射库的集成,分别是Jackson、Gson和JSON-B。
Jackson(默认)
-
Spring Boot 为Jackson 提供了自动配置功能。Jackson 是一个流行的 Java 库,用于处理 JSON 数据,它是
spring-boot-starter-json
启动器的一部分。 -
当 Jackson 库存在于项目的类路径(classpath)中时,Spring Boot 会自动配置一个
ObjectMapper
Bean。 -
ObjectMapper
是 Jackson 库的核心类,它负责 Java 对象和 JSON 数据之间的序列化(将 Java 对象转换为 JSON 字符串)和反序列化(将 JSON 字符串转换为 Java 对象)操作。
序列化和反序列化
-
当使用 Jackson 库进行 JSON 数据的序列化(将 Java 对象转换为 JSON 字符串)和反序列化(将 JSON 字符串转换为 Java 对象)操作时,有时需要编写自定义的
JsonSerializer
和JsonDeserializer
类。这是因为默认的序列化和反序列化规则可能无法满足特定业务场景的需求,比如需要对某些特殊类型的字段进行特定格式的处理,或者对某些对象的序列化和反序列化逻辑进行定制。 -
传统方式:通常情况下,自定义的序列化器需要通过 Jackson 的模块(
Module
)来进行注册,这种方式相对繁琐,需要编写额外的代码来创建和配置模块,然后将自定义的序列化器添加到模块中,最后再将模块注册到ObjectMapper
中。 -
Spring Boot 替代方案:Spring Boot 提供了
@JsonComponent
注解,这使得直接注册 Spring Bean 形式的自定义序列化器和反序列化器变得更加容易。通过这个注解,开发者可以避免编写复杂的模块注册代码,简化了自定义序列化和反序列化器的注册流程。
示例代码
@JsonComponent
public class MyJsonComponent {public static class Serializer extends JsonSerializer<MyObject> {@Overridepublic void serialize(MyObject value, JsonGenerator jgen, SerializerProvider serializers) throws IOException {jgen.writeStartObject();jgen.writeStringField("name", value.getName());jgen.writeNumberField("age", value.getAge());jgen.writeEndObject();}}public static class Deserializer extends JsonDeserializer<MyObject> {@Overridepublic MyObject deserialize(JsonParser jsonParser, DeserializationContext ctxt) throws IOException {ObjectCodec codec = jsonParser.getCodec();JsonNode tree = codec.readTree(jsonParser);String name = tree.get("name").textValue();int age = tree.get("age").intValue();return new MyObject(name, age);}}}
- Spring Boot 还提供了
JsonObjectSerializer
和JsonObjectDeserializer
这两个基础类。在进行对象序列化时,它们是标准 Jackson 版本的有用替代方案。这两个类可能提供了更便捷的方法或者默认实现,帮助开发者更轻松地实现自定义的序列化和反序列化逻辑。
@JsonComponent
public class MyJsonComponent {public static class Serializer extends JsonObjectSerializer<MyObject> {@Overrideprotected void serializeObject(MyObject value, JsonGenerator jgen, SerializerProvider provider)throws IOException {jgen.writeStringField("name", value.getName());jgen.writeNumberField("age", value.getAge());}}public static class Deserializer extends JsonObjectDeserializer<MyObject> {@Overrideprotected MyObject deserializeObject(JsonParser jsonParser, DeserializationContext context, ObjectCodec codec,JsonNode tree) throws IOException {String name = nullSafeValue(tree.get("name"), String.class);int age = nullSafeValue(tree.get("age"), Integer.class);return new MyObject(name, age);}}}
Jackson 混合注解
Jackson 本身支持混合注解(Mixins)功能。混合注解可以将额外的注解混入到目标类已声明的注解中。这意味着在不修改目标类源代码的情况下,能够为其添加或修改序列化和反序列化的相关注解,从而改变其 JSON 处理行为。例如,当你没有目标类的源代码,或者不想直接在目标类上添加注解时,就可以使用混合注解来实现自定义的 JSON 处理逻辑。
Spring Boot 对混合注解的自动配置支持
Spring Boot 为 Jackson 的混合注解功能提供了自动配置。具体来说,Spring Boot 的 Jackson 自动配置会扫描应用程序的包,查找使用 @JsonMixin
注解标注的类。一旦发现这些类,就会将它们注册到自动配置的 ObjectMapper
中。
Gson
-
Spring Boot 为 Gson 提供了自动配置功能。当 Gson 库存在于类路径(classpath)中时,Spring Boot 会自动配置一个 Gson Bean。
-
Spring Boot 提供了一系列以 spring.gson.* 开头的配置属性,开发者可以通过这些属性对 Gson 的配置进行定制。
-
如果开发者需要对 Gson 的配置进行更精细的控制,可以创建一个或多个 GsonBuilderCustomizer Bean。GsonBuilderCustomizer 允许开发者对 GsonBuilder 进行自定义设置,GsonBuilder 是用于构建 Gson 对象的工具,通过它可以灵活地定制 Gson 的各种特性,如注册自定义的序列化器和反序列化器等。
JSON-B
-
Spring Boot 为 JSON - B 提供了自动配置机制。当项目的类路径(classpath)中同时存在 JSON - B 的 API 和其具体实现时,Spring Boot 会自动配置一个
Jsonb
Bean。 -
Spring Boot 推荐使用 Eclipse Yasson 作为 JSON - B 的具体实现。并且,Spring Boot 还提供了针对 Eclipse Yasson 的依赖管理功能。这使得开发者在引入和使用 Eclipse Yasson 时更加方便,无需手动处理复杂的依赖关系,Spring Boot 会自动处理好所需的依赖版本等问题。
任务执行与调度
自动配置的执行器(Executor)
若项目中无自定义的Executor bean,Spring Boot 会自动配置一个 AsyncTaskExecutor。当虚拟线程启用时,Spring Boot 自动配置 SimpleAsyncTaskExecutor;否则,为带有合理默认值的ThreadPoolTaskExecutor。
自动配置的执行器将自动用于:
-
异步任务执行(
@EnableAsync
) -
Spring for GraphQLCallable对控制器方法返回值的异步处理
-
Spring MVC 的异步请求处理
-
Spring WebFlux 的阻塞执行支持
-
注意事项:
若定义了自定义的 Executor,常规任务执行(
@EnableAsync
)和 Spring for GraphQL 会使用它。但 Spring MVC 和 Spring WebFlux 仅在其为 AsyncTaskExecutor 实现(名为 applicationTaskExecutor)时才会使用。
可将自定义 Executor 转换为 AsyncTaskExecutor,或定义一个 AsyncTaskExecutor 和一个包装自定义 Executor 的 AsyncConfigurer。
执行器配置及微调
-
我们可以使用 ThreadPoolTaskExecutorBuilder 来快速构建一个ThreadPoolTaskExecutor执行器。以下是代码示例:
package person.wend.springbootlearnexample.config;import org.springframework.boot.task.ThreadPoolTaskExecutorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.concurrent.Executor;@Configuration
public class ThreadPoolConfig {@Bean(name = "customTaskExecutor")public Executor customTaskExecutor(ThreadPoolTaskExecutorBuilder builder) {// 返回一个默认配置return builder.build();}
}
-
自动配置的 ThreadPoolTaskExecutor 默认使用 8 个核心线程,可根据负载增长和收缩。
-
我们可以通过
spring.task.execution
命名空间对默认配置进行微调,如设置最大线程数、队列容量和线程空闲回收时间等。以下是一个配置示例:
spring:task:execution:pool:max-size: 16queue-capacity: 100keep-alive: "10s"
-
以上配置会将线程池更改为使用有界队列,这样当队列已满(100 个任务)时,线程池将增加到最多 16 个线程。线程池的收缩更为激进,因为线程在空闲 10 秒(而不是默认的 60 秒)后会被回收。
调度任务配置及微调
-
我们可以通过 new 一个 ThreadPoolTaskScheduler 的方式,自定义初始化一个调度任务执行器。以下是代码示例:
package person.wend.springbootlearnexample.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;@Configuration
public class SchedulerConfig {@Beanpublic ThreadPoolTaskScheduler taskScheduler() {ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();// 设置线程池大小scheduler.setPoolSize(5);// 设置线程名称前缀scheduler.setThreadNamePrefix("task-scheduler-");// 等待任务在关机时完成scheduler.setWaitForTasksToCompleteOnShutdown(true);// 设置关机时等待任务完成的最大时长(毫秒)scheduler.setAwaitTerminationSeconds(60);return scheduler;}
}
-
Spring Boot 提供的调度任务执行器ThreadPoolTaskScheduler默认情况下使用一个线程,我们可以通过spring.task.scheduling命令空间对其进行微调,以下是一个配置示例:
spring:task:scheduling:thread-name-prefix: "scheduling-"pool:size: 2
Spring Boot 日志管理
Spring Boot 日志管理(官网文档解读)-CSDN博客
自定义配置和自定义Spring Boot Starter
自定义Spring Boot Starter(官网文档解读)-CSDN博客
Spring Boot 升级
Spring Boot 版本升级主要分为两个部分,从1.x 版本升级至2.x 版本的升级和2.x版本升级至3.x版本的升级。两个版本的升级方式和升级功能列表均需参考官网提供的升级策略文档。
- 1.x 至 2.x:Spring Boot 2.0 Migration Guide · spring-projects/spring-boot Wiki · GitHub
- 2.x 至 3.x:https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide
Spring Boot 在升级到新功能版本时,某些属性可能已被重命名或删除。Spring Boot 提供了一种在启动时分析应用程序环境并打印诊断信息的方法,但也可以在运行时为您临时迁移属性。要启用该功能,请将以下依赖项添加到您的项目:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-properties-migrator</artifactId><scope>runtime</scope>
</dependency>
一旦完成迁移,请确保从项目依赖项中删除此模块。
Spring Boot CLI
Spring Boot CLI(Command - Line Interface)是一个命令行工具,用于快速开发和运行 Spring Boot 应用程序。它提供了一种便捷的方式来创建、构建和启动 Spring Boot 应用,尤其适合于快速原型开发和简单应用场景。
主要功能
-
快速创建项目:Spring Boot CLI 可以帮助您快速创建一个 Spring Boot 项目的基本骨架。您可以使用命令行指令来初始化一个新项目,而不需要手动创建复杂的目录结构和配置文件。例如,通过
spring init
命令可以创建一个新的 Spring Boot 项目,并且可以指定项目类型(如 Web 应用、批处理应用等)、编程语言(如 Java、Groovy 等)以及其他相关的属性。 -
简化依赖管理:它能够自动处理项目的依赖关系。在传统的项目开发中,需要在构建文件(如 Maven 的 pom.xml 或 Gradle 的 build.gradle)中详细列出项目所需要的依赖项。而使用 Spring Boot CLI,它会根据项目的类型和特性自动引入必要的 Spring Boot 核心依赖和相关的第三方依赖。例如,如果您创建一个 Spring Boot Web 应用,它会自动添加
spring - web
、spring - boot - starter - web
等相关的依赖,减少了手动配置依赖的繁琐工作。 -
支持多种编程语言:Spring Boot CLI 支持多种编程语言,如 Java 和 Groovy。特别是 Groovy,它具有简洁的语法和动态特性,非常适合快速开发。您可以使用 Groovy 编写 Spring Boot 应用的代码,并且可以在命令行环境中直接运行这些代码,无需进行复杂的编译过程。例如,您可以使用 Groovy 编写一个简单的 RESTful API Controller,然后使用 Spring Boot CLI 立即运行这个应用,快速验证接口的功能。
-
运行和测试应用:可以使用 Spring Boot CLI 来运行和测试您开发的应用程序。它提供了简单的运行命令,如
java -jar
(用于运行打包后的应用)或直接运行脚本文件(如果是使用 Groovy 等脚本语言编写的应用)。同时,它也支持一些测试相关的功能,例如,可以在命令行环境中运行单元测试或集成测试,方便您对应用进行质量检查。
工作原理
-
依赖解析机制:Spring Boot CLI 通过内部的依赖解析机制来确定项目所需的依赖项。它参考 Spring Boot 的版本兼容性矩阵和默认的依赖配置规则。当您创建一个项目或者运行一个应用时,CLI 会根据项目的类型(如 Web 应用、数据访问应用等)和指定的功能需求,从 Maven 或 Gradle 仓库中查找并下载合适的依赖。例如,如果您创建一个带有数据库访问功能的 Spring Boot 应用,CLI 会根据配置查找
spring-boot-starter-data-jpa
以及相应的数据库驱动等依赖。 -
代码加载和运行方式:对于 Java 代码,Spring Boot CLI 会按照标准的 Java 类加载和运行方式进行处理。对于 Groovy 代码,它利用 Groovy 的运行时环境来加载和运行代码。在运行应用时,CLI 会启动一个 Spring Boot 应用上下文,将应用中的组件(如 Controller、Service、Repository 等)进行初始化和配置,就像在传统的 Spring Boot 项目开发中一样,然后启动应用的服务器(如 Tomcat、Jetty 等)来提供服务。
参考文献
Spring Boot :: Spring Boot
相关文章:
Spring Boot 概要(官网文档解读)
Spring Boot 概述 Spring Boot 是一个高效构建 Spring 生产级应用的脚手架工具,它简化了基于 Spring 框架的开发过程。 Spring Boot 也是一个“构件组装门户”,何为构件组装门户呢?所谓的“构件组装门户”指的是一个对外提供的Web平台&#x…...
图像处理篇---图像处理中常见参数
文章目录 前言一、分贝(dB)的原理1.公式 二、峰值信噪比(PSNR, Peak Signal-to-Noise Ratio)1.用途2.公式3.示例 三、信噪比(SNR, Signal-to-Noise Ratio)1.用途2.公式3.示例 四、动态范围(Dyna…...
Win11更新系统c盘爆满处理
1.打开磁盘管理 2.右击c盘选择属性,进行磁盘管理,选择详细信息。 3.选择以前安装的文件删除即可释放c盘空间。...
C++关键字之mutable
1.介绍 在C中,mutable是一个关键字,用于修饰类的成员变量。它的主要作用是允许在常量成员函数或常量对象中修改被标记为mutable的成员变量。通常情况下,常量成员函数不能修改类的成员变量,但有些情况下,某些成员变量的…...
vue3 采用xlsx库实现本地上传excel文件,前端解析为Json数据
需求:本地上传excel 文件,但需要对excel 文件的内容进行解析,然后展示出来 1. 安装依赖 首先,确保安装了 xlsx 库: bash复制 npm install xlsx 2. 创建 Vue 组件 创建一个 Vue 组件(如 ExcelUpload.v…...
【Linux系统】—— 冯诺依曼体系结构与操作系统初理解
【Linux系统】—— 冯诺依曼体系结构与操作系统初理解 1 冯诺依曼体系结构1.1 基本概念理解1.2 CPU只和内存打交道1.3 为什么冯诺依曼是这种结构1.4 理解数据流动 2 操作系统2.1 什么是操作系统2.2 设计OS的目的2.3 操作系统小知识点2.4 如何理解"管理"2.5 系统调用和…...
易语言模拟真人鼠标轨迹算法 - 防止游戏检测
一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…...
PHP旅游门票预订系统小程序源码
🌍 旅游门票预订系统:一站式畅游新体验,开启您的梦幻旅程 🌟 一款基于ThinkPHPUniapp精心雕琢的旅游门票预订系统,正翘首以待,为您揭开便捷、高效、全面的旅游预订新篇章!它超越了传统预订平台…...
侯捷 C++ 课程学习笔记:内存管理的每一层面
目录 一、C 应用程序的内存管理架构 二、C 内存原语 三、内存管理的实际应用 四、学习心得 一、C 应用程序的内存管理架构 C 应用程序的内存管理架构可以分为多个层次,从应用程序到操作系统 API,每一层都提供了不同的内存管理功能。 架构图…...
Python开发Django面试题及参考答案
目录 Django 的请求生命周期是怎样的? Django 的 MTV 架构中的各个组件分别是什么? Django 的 URL 路由是如何工作的? Django 的视图函数和视图类有什么区别? Django 的模板系统是如何渲染 HTML 的? Django 的 ORM 是如何工作的? Django 的中间件是什么?它的作用是…...
前端js进阶,ES6语法,包详细
进阶ES6 作用域的概念加深对js理解 let、const申明的变量,在花括号中会生成块作用域,而var就不会生成块作用域 作用域链本质上就是底层的变量查找机制 作用域链查找的规则是:优先查找当前作用域先把的变量,再依次逐级找父级作用域直到全局…...
【三十四周】文献阅读:DeepPose: 通过深度神经网络实现人类姿态估计
目录 摘要AbstractDeepPose: 通过深度神经网络实现人类姿态估计研究背景创新点方法论归一化网络结构级联细化流程 代码实践局限性实验结果总结 摘要 人体姿态估计旨在通过图像定位人体关节,是计算机视觉领域的核心问题之一。传统方法多基于局部检测与图模型&#x…...
将 Vue 项目打包后部署到 Spring Boot 项目中的全面指南
将 Vue 项目打包后部署到 Spring Boot 项目中的全面指南 在现代 Web 开发中,前后端分离架构已经成为主流。然而,在某些场景下,我们可能需要将前端项目(如 Vue)与后端项目(如 Spring Boot)集成部…...
Linux 权限系统和软件安装(二):深入理解 Linux 权限系统
在 Linux 的世界里,权限系统犹如一位忠诚的卫士,严密守护着系统中的文件与目录,确保只有具备相应权限的用户才能进行操作。与其他一些操作系统不同,Linux 并不依据文件后缀名来标识文件的操作权限,而是构建了一套独特且…...
计算机网络常考大题
运输层的主要功能 运输层为应用进程之间提供端到端的逻辑通信。 运输层还要对收到的报文进行差错检测。 运输层需要有两种不同的运输协议,即面向连接的 TCP 和无连接的 UDP 传输控制协议 TCP 概述 TCP 是面向连接的运输层协议。 每一条 TCP 连接只能有两个端点…...
百度首页上线 DeepSeek 入口,免费使用
大家好,我是小悟。 百度首页正式上线了 DeepSeek 入口,这一重磅消息瞬间在技术圈掀起了惊涛骇浪,各大平台都被刷爆了屏。 百度这次可太给力了,PC 端开放仅 1 小时,就有超千万人涌入体验。这速度,简直比火…...
《跟李沐学 AI》AlexNet论文逐段精读学习心得 | PyTorch 深度学习实战
前一篇文章,使用 AlexNet 实现图片分类 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 本篇文章内容来自于学习 9年后重读深度学习奠基作之一:AlexNet【下】【论文精读】】的心得。 《跟李沐…...
Linux搭建Nginx直播流媒体服务RTMP/RTSP转Http-flv视频浏览器在线播放/Vue/Java/ffmpeg
参考文章: https://blog.csdn.net/whatareyouding/article/details/144317654 https://www.cnblogs.com/Gredae/p/18362900 https://www.cnblogs.com/kn-zheng/p/17422707.html https://blog.51cto.com/u_16099344/10281495 https://www.tulingxueyuan.cn/tlzx/jsp…...
Node.js高频面试题精选及参考答案
目录 什么是 Node.js?它的主要特点有哪些? Node.js 的事件驱动和非阻塞 I/O 模型是如何工作的? 为什么 Node.js 适合处理高并发场景? Node.js 与传统后端语言(如 Java、Python)相比,有哪些优势和劣势? 简述 Node.js 的运行原理,包括 V8 引擎的作用。 什么是 Nod…...
公开整理-最新中国城市统计NJExcel+PDF版本(1985-2024年)
数据简介:《中国城市统计NJ》从1985年开始,本NJ内容共分四个部分:第一部分是全国城市行政区划,列有不同区域、不同级别的城市分布情况;第二、三部分分别是地级以上城市统计资料和县级城市统计资料,具体包括人口、劳动力及土地资源、综合经济、工业、交通…...
ModuleNotFoundError: No module named ‘xgboost‘
问题: --------------------------------------------------------------------------- ModuleNotFoundError Traceback (most recent call last) Cell In[1], line 64 import pickle5 from sklearn.metrics import mean_squared_error, r2_…...
应用层协议HTTP
应用层协议HTTP 引言 应用层协议是程序员自己制定的,但是良好的协议是保证网络通信的基础,前代的计算工程师已经帮助我们制定了一些很好用的应用层协议,http(hybertext transfer protocol)(超文本传输协议)就是其中之一。 http协议是客户端…...
常见的“锁”有哪些?
悲观锁 悲观锁认为在并发环境中,数据随时可能被其他线程修改,因此在访问数据之前会先加锁,以防止其他线程对数据进行修改。常见的悲观锁实现有: 1.互斥锁 原理:互斥锁是一种最基本的锁类型,同一时间只允…...
PAT 甲级 1091 Acute Stroke
一开始只是简单的递归(bfs),导致最后两个没法通过(爆栈了) //最后两个案例没有通过,只是最简单的bfs暴力算法 #include<cstdio> using namespace std; int v[62][1288][130]{0}; int find(int i,int…...
flowable适配达梦数据库
文章目录 适配相关问题无法从数据库产品名称“DM DBMS”中推断数据库类型分析解决 构建ibatis SqlSessionFactory时出错:inStream参数为null分析解决 liquibase相关问题问题一:不支持的数据库 Error executing SQL call current_schema: 无法解析的成员访…...
Git入门:数据模型 to 底层原理
版本控制系统(VCS)是软件开发中不可或缺的工具,而Git作为现代版本控制的事实标准,其底层设计远比表面命令更加优雅。本文将从数据模型的角度,揭示Git的核心工作原理。 Git的核心概念 1. 快照(Snapshot&am…...
Bootstrap Blazor UI 中 <Table> 组件 <TableColumn> 使用备忘01:EF Core 外码处理
应用场景:将外码转换为对应的文本进行显示、编辑。 例如,有一个【用户】表,其中有一个【用户类型ID】字段;另有一个【用户类型】表,包含【ID】、【名称】等字段。现在要求在 <Table> 组件显示列表中,…...
Redis过期数据处理
Redis缓存过期后数据还能恢复吗? Redis缓存过期后,数据通常会被删除,但可以通过以下几种方法尝试恢复数据: 1. 数据备份恢复 RDB 持久化恢复:Redis 提供了 RDB(Redis Database Backup)持久化…...
零基础学C/C++160——字符串
题目描述 给定两个由小写字母组成的字符串A和B,判断B中的字符是否全部在A中出现。 输入 输入为多组测试数据。 输入数据只有一行,包含2个字符串A和B,每个字符串后面有一个#字符标记(#不属于A或B),其中B…...
Spring Boot+Vue项目从零入手
Spring BootVue项目从零入手 一、前期准备 在搭建spring bootvue项目前,我们首先要准备好开发环境,所需相关环境和软件如下: 1、node.js 检测安装成功的方法:node -v 2、vue 检测安装成功的方法:vue -V 3、Visu…...
Linux 命令大全完整版(13)
5.文件管理命令 patch 功能说明:修补文件。语 法:patch [-bceEflnNRstTuvZ][-B <备份字首字符串>][-d <工作目录>][-D <标示符号>][-F <监别列数>][-g <控制数值>][-i <修补文件>][-o <输出文件>][-p &l…...
MySQL面试学习
MySQL 1.事务 事务的4大特性 事务4大特性:原子性、一致性、隔离性、持久性 原⼦性: 事务是最⼩的执⾏单位,不允许分割。事务的原⼦性确保动作要么全部完成,要么全不执行一致性: 执⾏事务前后,数据保持⼀…...
CentOS中shell脚本对多台机器执行下载安装
1.建立免密ssh连接 详情见这篇: CentOS建立ssh免密连接(含流程剖析)-CSDN博客 2.脚本编写 我这里只是简单写了个demo进行演示,如果服务器很多可以先暂存成文件再逐行读取host进行连接并执行命令 用node1去ssh连接node2和node…...
【Java】多线程和高并发编程(四):阻塞队列(上)基础概念、ArrayBlockingQueue
文章目录 四、阻塞队列1、基础概念1.1 生产者消费者概念1.2 JUC阻塞队列的存取方法 2、ArrayBlockingQueue2.1 ArrayBlockingQueue的基本使用2.2 生产者方法实现原理2.2.1 ArrayBlockingQueue的常见属性2.2.2 add方法实现2.2.3 offer方法实现2.2.4 offer(time,unit)方法2.2.5 p…...
C语言多人聊天室 ---chat(客户端聊天)
head.h #ifndef __HEAD_H #define __HEAD_H// 常用头文件 #include <stdio.h> #include <stdlib.h> #include <string.h>// 网络编程涉及的头文件 #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h>#include <…...
设计模式教程:命令模式(Command Pattern)
1. 什么是命令模式? 命令模式(Command Pattern)是一种行为型设计模式。它将请求封装成一个对象,从而使你能够用不同的请求、队列和日志请求以及支持可撤销操作。 简单来说,命令模式通过把请求封装成对象的方式解耦了…...
【华三】STP的角色选举(一文讲透)
【华三】STP的角色选举 一、引言二、STP基础概念扫盲三、根桥选举过程详解四、根端口选举过程详解五、指定端口选举过程详解六、阻塞端口七、总结与配置建议七、附录**1. BPDU字段结构图(文字描述)****2. 华三STP常用命令速查表** 文章总结 一、引言 在…...
Trae+Qt+MSVC环境配置
Trae Trae是字节跳动基于VSCode推出的AI集成开发环境(IDE),是一款专为中文开发者深度定制的智能编程工具。其目标是通过AI技术实现从“Copilot”到“Autopilot”的编程模式演进。 类似这样的IDE比如Windsurf、Cursor,都是基于VS…...
SpringSecurity初始化的本质
一、对SpringSecurity初始化的几个疑问 通过前面第一次请求访问的分析我们明白了一个请求就来后的具体处理流程 对于一个请求到来后会通过FilterChainProxy来匹配一个对应的过滤器链来处理该请求。那么这里我们就有几个疑惑。 FilterChainProxy什么时候创建的?过滤器链和对应的…...
3D Gaussian Splatting(3DGS)的核心原理
3D Gaussian Splatting(3DGS)的核心原理 1. 基本概念 3D Gaussian Splatting(3DGS) 是一种基于 高斯分布的点云表示与渲染技术,核心思想是将三维场景建模为一系列 可学习的高斯分布,每个高斯分布具有以下…...
Transformers快速入门-学习笔记
一、自然语言处理 NLP 是借助计算机技术研究人类语言的科学自然语言处理发展史 一、不懂语法怎么理解语言 依靠语言学家人工总结文法规则 Chomsky Formal Languages 难点:上下文有关文法 规则增多,存在矛盾 二、只要看得足够多,就能处理语言…...
【Http和Https区别】
概念: 一、Http协议 HTTP(超文本传输协议)是一种用于传输超媒体文档(如HTML)的应用层协议,主要用于Web浏览器和服务器之间的通信。http也是客户端和服务器之间请求与响应的标准协议,客户端通常…...
学习路程二 LangChain基本介绍
前面简单调用了一下deepseek的方法,发现有一些疑问和繁琐的问题,需要更多的学习,然后比较流行的就是LangChain这个东西了。 目前大部分企业都是基于 LangChain 、qwen-Agent、lammaIndex框架进行大模型应用开发。LangChain 提供了 Chain、To…...
简识Kafka集群与RocketMQ集群的核心区别
前记:各位潘安、各位子健/各位彦祖、于晏,文字较多,优先看目录。 Kafka集群与RocketMQ集群的核心区别及架构图例说明 一、核心区别对比 特性Kafka 集群RocketMQ 集群设计目标高吞吐量实时日志流系统(如日志收集、大数据流水线&a…...
基于Python+django+mysql旅游数据爬虫采集可视化分析推荐系统
2024旅游推荐系统爬虫可视化(协同过滤算法) 基于Pythondjangomysql旅游数据爬虫采集可视化分析推荐系统 有文档说明 部署文档 视频讲解 ✅️基于用户的协同过滤推荐算法 卖价就是标价~ 项目技术栈 Python语言、Django框架、MySQL数据库、requests网络爬虫…...
9-1. MySQL 性能分析工具的使用——last_query_cost,慢查询日志
9-1. MySQL 性能分析工具的使用——last_query_cost,慢查询日志 文章目录 9-1. MySQL 性能分析工具的使用——last_query_cost,慢查询日志1. 数据库服务器的优化步骤2. 查看系统性能参数3. 统计SQL的查询成本:last_query_cost4. 定位执行慢的…...
网络安全监测探针安装位置 网络安全监测系统
🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 软件简介: SockMon(SocketMonitor)网络安全监控系统是一款为电脑专业人员打造的一款出色的安防监控软件。在如今这个恶意软件,攻击&#…...
Git版本控制系统---本地操作(万字详解!)
目录 git基本配置 认识工作区、暂存区、版本库 添加文件--情况一: 添加文件-情况二: 修改文件: 版本回退: git基本配置 1.初始化本地仓库,注意:一定要在一个目录下进行,一般都是新建一个文件夹,在文件…...
forge-1.21.x模组开发(二)给物品添加功能
功能效果 创建一个兑换券,当使用兑换券对着兑换机右键时,获得一条烤鱼 创建兑换券 创建ExchangeCouponsItem.java,继承Item,定义兑换券内容 public class ExchangeCouponsItem extends Item {public ExchangeCouponsItem(Prop…...
elasticsearch在windows上的配置
写在最前面: 上资源 第一步 解压: 第二步 配置两个环境变量 第三步 如果是其他资源需要将标蓝的文件中的内容加一句 xpack.security.enabled: false 不同版本的yaml文件可能配置不同,末尾加这个 xpack.security.enabled: true打开bin目…...