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-spacePOM 编辑器并键入“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 应用(官网文档解读)-CSDN博客

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 {

    @Bean
    public LocaleResolver localeResolver() {
        SessionLocaleResolver slr = new SessionLocaleResolver();
        slr.setDefaultLocale(Locale.US); // 设置默认语言环境
        return slr;
    }

    @Bean
    public LocaleChangeInterceptor localeChangeInterceptor() {
        LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
        lci.setParamName("lang"); // 设置切换语言的请求参数名
        return lci;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(localeChangeInterceptor());
    }

    @Bean
    public 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> {

		@Override
		public 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> {

		@Override
		public 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> {

		@Override
		protected 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> {

		@Override
		protected 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: 16
        queue-capacity: 100
        keep-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 {

    @Bean
    public 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 - webspring - 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/975797.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计SpringBoot+Vue.jst0甘肃非物质文化网站(源码+LW文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

匹配算法:向下就近原则,向下没有就向上

匹配算法&#xff1a;向下就近原则&#xff0c;向下没有就向上 实现方式一实现方式二总结 实现方式一 private static List<Integer> findMatches(List<Integer> sourceList, List<Integer> searchValues) {List<Integer> sortedList sourceList.stre…

ESP32S3:解决RWDT无法触发中断问题,二次开发者怎么才能使用内部RTC看门狗中断RWDT呢?

目录 基于ESP32S3:解决RWDT无法触发中断问题引言解决方案1. 查看报错日志2. 分析报错及一步一步找到解决方法3.小结我的源码基于ESP32S3:解决RWDT无法触发中断问题 引言 在嵌入式系统中,RWDT(看门狗定时器)是确保系统稳定性的重要组件。然而,在某些情况下,RWDT可能无法…

【GPU驱动】OpenGLES图形管线渲染机制

OpenGLES图形管线渲染机制 OpenGL/ES 的渲染管线也是一个典型的图形流水线&#xff08;Graphics Pipeline&#xff09;&#xff0c;包括多个阶段&#xff0c;每个阶段都负责对图形数据进行处理。管线的核心目标是将图形数据转换为最终的图像&#xff0c;这些图像可以显示在屏幕…

PHP post 数据丢失问题

max_input_vars是PHP配置选项之一&#xff0c;用于设置一个请求中允许的最大输入变量数。它指定了在处理POST请求或者通过URL传递的参数时&#xff0c;PHP脚本能够接收和处理的最大变量数量。 max_input_vars的默认值是1000&#xff0c;意味着一个请求中最多可以包含1000个输入…

Mac下Python版本管理,适用于pyenv不起作用的情况

前言 声明&#xff1a;之前也在网上看到过可以使用pyenv来管理python版本&#xff0c;但由于作者的python安装路径实在是繁杂不堪&#xff0c;因此安装完成pyenv体验下来没有任何用处&#xff0c;但偶然发现vscode似乎可以看到各个python版本&#xff0c;因此写下这篇博客记录…

什么是完全前向保密(PFS)?

在当今数字化时代&#xff0c;信息安全至关重要。而密码学中的完全前向保密&#xff08;Perfect Forward Secrecy&#xff0c;简称PFS&#xff09;技术&#xff0c;已经成为保障信息安全的关键一环。如果没有完全前向保密&#xff0c;一旦长期密钥被泄露&#xff0c;攻击者就可…

计算机毕业设计SpringBoot+Vue.jst在线文档管理系统(源码+LW文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

Vulnhun靶机-kioptix level 4-sql注入万能密码拿到权限ssh连接利用mysql-udf漏洞提权

目录 一、环境搭建信息收集扫描ip扫描开放端口扫描版本服务信息指纹探测目录扫描 二、Web渗透sql注入 三、提权UDF提权修改权限 一、环境搭建 然后选择靶机所在文件夹 信息收集 本靶机ip和攻击机ip 攻击机&#xff1a;192.168.108.130 靶机&#xff1a;192.168.108.141 扫描…

【NLP 31、预训练模型的发展过程】

人的行为&#xff0c;究竟是人所带来的思维方式不同还是与机器一样&#xff0c;刻在脑海里的公式呢&#xff1f; 只是因为不同的人公式不同&#xff0c;所以人的行为才不同&#xff0c;可这又真的是人引以为傲的意识吗&#xff1f; 人脑只是相当于一个大型、驳杂的处理器&#…

K8S下redis哨兵集群使用secret隐藏configmap内明文密码方案详解

#作者&#xff1a;朱雷 文章目录 一、背景环境及方案说明1.1、环境说明1.2、方案一&#xff1a;使用配置文件设置密码1.3、方案二&#xff1a;使用args 的命令行传参设置密码 二、redis secret configmap deployment参考2.1 创建secret-redis.yaml参考2.2 修改configmap配置参…

网络空间安全(2)应用程序安全

前言 应用程序安全&#xff08;Application Security&#xff0c;简称AppSec&#xff09;是一个综合性的概念&#xff0c;它涵盖了应用程序从开发到部署&#xff0c;再到后续维护的整个过程中的安全措施。 一、定义与重要性 定义&#xff1a;应用程序安全是指识别和修复应用程序…

【OS安装与使用】part5-ubuntu22.04基于conda安装pytorch+tensorflow

文章目录 一、待解决问题1.1 问题描述1.2 解决方法 二、方法详述2.1 必要说明2.2 应用步骤2.2.1 明确pytorch安装依赖2.2.2 conda创建虚拟环境2.2.3 安装pytorch2.2.4 验证pytorch安装2.2.5 安装Tensorflow2.2.6 验证Tensorflow安装 三、疑问四、总结 一、待解决问题 1.1 问题…

基于Python/Java的医院系统切换互联网医院深度编程对接探索

一、引言 1.1 研究背景与意义 在当今数字化时代,医疗行业的信息化进程不断加速,医院信息系统(Hospital Information System,HIS)作为医疗信息化的核心组成部分,对于提升医院管理效率、优化医疗服务质量起着至关重要的作用。随着互联网技术的飞速发展,互联网医院应运而…

从零开始的网站搭建(以照片/文本/视频信息通信网站为例)

本文面向已经有一些编程基础&#xff08;会至少一门编程语言&#xff0c;比如python&#xff09;&#xff0c;但是没有搭建过web应用的人群&#xff0c;会写得尽量细致。重点介绍流程和部署云端的步骤&#xff0c;具体javascript代码怎么写之类的&#xff0c;这里不会涉及。 搭…

Linux权限(一)

文章目录 基本指令sudo权限chmod修改目标属性修改角色 修改权限属性目录权限缺省权限 基本指令 sudo 1. sudo是对指令的短暂提权的 2. 比如安装软件&#xff0c;安装到系统中&#xff0c;需要管理员root权限&#xff0c;这些命令其实只安装了一份&#xff0c;普通用户和超级用…

CV -- 基于GPU版CUDA环境+Pycharm YOLOv8 目标检测

目录 下载 CUDA 下载 cuDNN 下载 anaconda 安装 PyTorch pycharm 搭配 yolo 环境并运行 阅读本文须知&#xff0c;需要电脑中有 Nvidia 显卡 下载 CUDA 打开 cmd &#xff0c;输入 nvidia-smi &#xff0c;查看电脑支持 CUDA 版本&#xff1a; 我这里是12.0&#xff0c;进入…

R语言安装教程(附安装包)R语言4.3.2版本安装教程

文章目录 前言一、安装包下载二、R-4.3.2安装步骤三、rtools43安装步骤四、RStudio安装步骤 前言 本教程将详细、全面地为你介绍在 Windows 系统下安装 R 语言 4.3.2 的具体步骤。无论你是初涉数据领域的新手&#xff0c;还是希望更新知识体系的专业人士&#xff0c;只要按照本…

springBoot统一响应1.0版本

前言&#xff1a; 通过实践而发现真理&#xff0c;又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识&#xff0c;又从理性认识而能动地指导革命实践&#xff0c;改造主观世界和客观世界。实践、认识、再实践、再认识&#xff0c;这种形式&#xff0c;循环往…

【STM32】内存管理

【STM32】内存管理 文章目录 【STM32】内存管理1、内存管理简介疑问&#xff1a;为啥不用标准的 C 库自带的内存管理算法&#xff1f;2、分块式内存管理&#xff08;掌握&#xff09;分配方向分配原理释放原理分块内存管理 管理内存情况 3、内存管理使用&#xff08;掌握&#…