Spring核心原理理解与总结

news2024/11/23 13:21:00

Spring 核心原理理解与总结

Spring 基础

什么是 Spring 框架?

Spring 是一款开源的轻量级 Java 开发框架,旨在提高开发人员的开发效率以及系统的可维护性。开箱即用。

一般说 Spring 框架指的都是 Spring Framework

核心功能主要是 IoC 和 AOP。

  • Spring 官网:https://spring.io/

  • 中文文档:https://springdoc.cn/

Spring 包含哪些模块?

Spring4.x 版本:

image

Spring5.x 版本:

image

4.x -> 5.x

主要变化:

  • Web 模块的 Portlet 组件被废弃了,
  • 同时增加了用于异步响应式处理的 WebFlux 组件
Core Container

Spring 框架的核心模块,也可以说是基础模块,主要提供 IoC 依赖注入功能的支持。

Spring 其他所有的功能基本都需要依赖于该模块。

主要包含:

  • spring-core:Spring 框架基本的核心工具类
  • spring-beans:提供对 bean 的创建、配置和管理等功能的支持。
  • spring-context:提供对国际化、事件传播、资源加载等功能的支持。
  • spring-expression:提供对表达式语言(Spring Expression Language)SpEL 的支持,只依赖于 core 模块,不依赖于其他模块,可以单独使用。
AOP
  • spring-aspects:该模块为与 AspectJ 的集成提供支持。
  • spring-aop:提供了面向切面的编程实现
  • spring-instrument:提供了为 JVM 添加代理(agent)的功能。 具体来讲,它为 Tomcat 提供了一个织入代理,能够为 Tomcat 传递【类文件】,就像这些文件是被类加载器加载的一样。
Data Access/Integration
  • spring-jdbc:提供了对数据库访问的抽象 JDBC。不同的数据库都有自己独立的 API 用于操作数据库,而 Java 程序只需要和 JDBC API 交互,这样就屏蔽了数据库的影响。
  • spring-tx:提供对事务的支持。
  • spring-orm:提供对 Hibernate、JPA、iBatis 等 ORM 框架的支持。
  • spring-oxm:提供一个抽象层支撑 OXM(Object-to-XML-Mapping),例如:JAXB、Castor、XMLBeans、JiBX 和 XStream 等。
  • spring-jms : 消息服务。自 Spring Framework 4.1 以后,它还提供了对 spring-messaging 模块的继承。
Spring Web
  • spring-web:对 Web 功能的实现提供一些最基础的支持。
  • spring-webmvc:提供对 Spring MVC 的实现。
  • spring-websocket:提供了对 WebSocket 的支持,WebSocket 可以让客户端和服务端进行双向通信
  • spring-webflux:提供对 WebFlux 的支持。WebFlux 是 Spring Framework 5.0 中引入的新的响应式框架。与 Spring MVC 不同,它不需要 Servlet API,是完全异步。
Messaging

spring-messaging 是从 Spring4.0 开始新加入的一个模块,主要职责是为 Spring 框架集成一些基础的报文传送应用。

Spring Test

提供了对测试的支持,包括了 JUnit 和 TestNG 等测试框架的集成,以及 Spring 应用程序的集成测试等。

核心模块总结
  1. Spring Core 模块:提供了 Spring 框架的核心功能,包括 IoC(控制反转)和 AOP(面向切面编程)等,是整个 Spring 框架的基础
  2. Spring Context 模块:建立在 Spring Core 模块之上,提供了一个框架式的上下文环境,用于管理 Bean 的生命周期和配置元数据等
  3. Spring JDBC 模块:提供了对 JDBC 的封装,简化了数据库访问的操作,包括了连接管理、事务管理、异常处理等。
  4. Spring ORM 模块:提供了对 ORM(对象关系映射)框架的支持,包括了 Hibernate、MyBatis 等,使得 Java 应用程序可以方便地访问数据库。
  5. Spring Web 模块:提供了对 Web 开发的支持,包括了 Web 应用程序的 MVC 框架、RESTful Web 服务、WebSocket 等。
  6. Spring Test 模块:提供了对测试的支持,包括了 JUnit 和 TestNG 等测试框架的集成,以及 Spring 应用程序的集成测试等。
  7. Spring Security 模块:提供了对安全性的支持,包括了认证、授权、加密等,使得 Java 应用程序可以更好地保护用户数据和隐私。

Spring,Spring MVC,Spring Boot 之间是什么关系?

Spring、Spring MVC 和 Spring Boot 是 Spring 框架的三个核心模块。

它们有以下的关系:

  1. SpringSpring 框架的核心模块,主要提供了 IoC 容器、AOP、事务管理等功能,它是其他两个模块的基础

  2. Spring MVC在 Spring 基础上开发的 Web 框架,提供了 MVC 架构的支持,可以用来开发 Web 应用程序。Spring MVC 可以通过 Spring IoC 容器来管理控制器、视图和其他组件。

  3. Spring Boot 是基于 Spring 框架的快速开发框架,提供了自动化配置、快速启动、自带服务器等功能,可以快速地开发独立的、生产级别的 Spring 应用程序。

    Spring Boot 不仅整合了 Spring 和 Spring MVC 所有的功能,还提供了许多便利的功能,如对嵌入式服务器的支持、对各种数据源的自动配置等。

因此,可以看出

  • Spring MVC 和 Spring Boot 都是建立在 Spring 框架之上的,
  • Spring MVC 是 Spring 框架在 Web 开发方面的扩展,
  • 而 Spring Boot 则是在 Spring MVC 的基础上,通过自动化配置和快速启动等功能,进一步简化了 Spring 应用程序的开发。

Spring MVC

说说自己对于 Spring MVC 了解?

MVC 是模型(Model)视图(View)控制器(Controller)的简写,其核心思想是通过将业务逻辑、数据、显示分离来组织代码。

Spring MVC 是 Spring 框架中的一个模块,用于构建基于 Servlet 的 Web 应用程序,它是一种基于 MVC(Model-View-Controller)设计模式的 Web 框架。

  1. 模型层(Model)负责业务逻辑
  2. 视图层(View)负责呈现数据
  3. 控制器层(Controller)负责接收请求并处理请求,将 Model 和 View 集成在一起。

更早的时期,是使用 ServletJSP 的时代。

Spring MVC 的核心组件有哪些?

  • DispatcherServlet核心的中央处理器,负责接收请求、分发,并给予客户端响应。
  • HandlerMapping处理器映射器,根据 uri 去匹配查找能处理的 Handler ,并会将请求涉及到的拦截器和 Handler 一起封装。
  • HandlerAdapter处理器适配器,根据 HandlerMapping 找到的 Handler ,适配执行对应的 Handler
  • Handler请求处理器,处理实际请求的处理器。(Controller)
  • ViewResolver视图解析器,根据 Handler 返回的逻辑视图 / 视图,解析并渲染真正的视图,并传递给 DispatcherServlet 响应客户端。

拦截器和过滤器了解么?

拦截器和过滤器都是 Java Web 开发中常用的组件,用于对请求进行拦截和处理,但它们有一些区别。

1、拦截器

拦截器(Interceptor)是 Spring MVC 框架中的一种组件,它可以对请求进行拦截、处理和转发,通常用于实现用户认证、日志记录、性能监控等功能。

拦截器的执行顺序是由配置顺序决定的,可以通过实现 HandlerInterceptor 接口来自定义拦截器。

Spring MVC 框架支持多个拦截器,可以通过配置文件或注解来添加拦截器

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 在请求处理之前进行拦截,可以进行权限验证、日志记录等操作
        return true; // 返回true表示继续执行后续的请求处理
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 在请求处理之后但还未渲染视图时进行拦截,可以对数据进行处理或者添加公共数据到视图中
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 在请求处理完成并视图渲染之后进行拦截,可以进行一些资源清理的工作
    }
}

从上面的代码可以看出,拦截器包含三个方法:preHandle 请求的前置拦截、postHandle 请求处理后的拦截、afterCompletion 请求完成后的拦截。

2、过滤器

过滤器(Filter)是 Servlet 规范中的一种组件,它可以对请求进行过滤和处理,通常用于实现字符编码转换、请求参数解析、安全控制等功能。

过滤器的执行顺序是由配置顺序决定的,可以通过实现 Filter 接口来自定义过滤器。

Servlet 规范支持多个过滤器,可以通过配置文件或注解来添加过滤器。

public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 过滤器初始化,在应用启动时执行
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 过滤器主体逻辑,可以在此处进行请求、响应的处理和拦截
        chain.doFilter(request, response); // 调用FilterChain的doFilter方法将请求传递给下一个过滤器或Servlet
    }
    @Override
    public void destroy() {
        // 过滤器销毁,在应用关闭时执行
    }
}

从上面代码可以看出,过滤器也包含三个方法:init 过滤器初始化、doFilter 过滤器主体逻辑、destroy 过滤器销毁。

3、拦截器和过滤器的区别

拦截器和过滤器的区别在于它们的作用范围使用场景不同。

拦截器的作用范围是在 Controller 层,用于拦截和处理请求,通常用于实现业务逻辑的控制和处理

而过滤器的作用范围是在 Servlet 层,用于过滤和处理请求,通常用于实现请求的预处理和后处理

拦截器和过滤器的使用场景也不同,一般来说,应该优先选择使用拦截器来实现业务逻辑控制和处理,只有在特定的情况下才需要使用过滤器来实现请求的预处理和后处理。

Spring MVC 的请求处理流程

大致分为 7 个步骤:

  1. 首先,客户端发送请求到 DispatcherServlet 核心中央处理器
  2. 然后 DispatcherServlet 接收请求并将请求交给 HandlerMapping 处理器映射器 进行处理,
  3. HandlerMapping 根据请求的 URL 找到对应的 Controller 请求处理器
  4. Controller 处理请求并返回一个 ModelAndView 对象,ModelAndView 包含数据模型和视图名称,
  5. DispatcherServlet 将 ModelAndView 对象交给 ViewResolver 视图解析器 进行处理,
  6. ViewResolver 将逻辑视图名称解析成真正的视图实现,
  7. 最后 DispatcherServlet 将请求转发到对应的视图实现,由视图实现将模型数据呈现给客户端。

Spring 框架中用到了哪些设计模式?

  1. 工厂设计模式 : Spring 使用工厂模式通过 BeanFactoryApplicationContext 创建 bean 对象。
  2. 代理设计模式 : Spring AOP 功能的实现。
  3. 单例设计模式 : Spring 中的 Bean 默认都是单例的。
  4. 模板方法模式 : Spring 中 jdbcTemplatehibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。
  5. 包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
  6. 观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。
  7. 适配器模式 : Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配 Controller

Spring 事务

@Transactional(rollbackFor = Exception.class)注解了解吗?

  • @Transactional 注解中如果不配置 rollbackFor 属性,那么事务只会在遇到 RuntimeException 的时候才会回滚,
  • 加上 rollbackFor=Exception.class, 可以让事务在遇到非运行时异常时也会回滚。

常见反序列化注解

反序列化请求体

@RequestBody 注解:

  • 用途:将请求体中的数据反序列化为 Java 对象。
  • 用法:通常用于处理发送 JSON 或 XML 数据的 POST 和 PUT 请求。
  • 示例:@RequestBody Person person

反序列化参数

  1. @RequestParam 注解:
    • 用途:从 URL 查询参数中获取值。
    • 示例:@RequestParam String name, @RequestParam int age
    • url:http://localhost:7529/getName?name=zhangsan
  2. @PathVariable 注解:
    • 用途:从 URL 路径中获取值。(通常用于 Restful 风格接口的实现)
    • 示例:@PathVariable Long id
    • url:http://localhost:7529/device/44050000081197526009
  3. @RequestHeader 注解:
    • 用途:从请求头中获取值,例如获取 Content-Type 或自定义的请求头信息。
    • 示例:@RequestHeader("User-Agent") String userAgent
  4. 自定义注解:
    • 用途:创建自定义注解来反序列化特定类型的参数。
    • 示例:@DateParam Date birthDate

Bean 的生命周期

包括以下几个阶段:

  1. 实例化:容器根据 Bean 定义创建 Bean 的实例。
  2. 属性填充:容器为 Bean 的属性设置值,包括通过构造函数注入和 setter 方法注入。
  3. 初始化:在 Bean 实例创建完成并设置好属性后,容器会调用 Bean 的初始化方法。可以通过配置初始化方法,或实现 InitializingBean 接口来自定义初始化逻辑。
  4. 使用:Bean 可以被应用程序使用,执行业务逻辑。
  5. 销毁:当 Bean 不再需要时,容器会调用 Bean 的销毁方法。可以通过配置销毁方法,或实现 DisposableBean 接口来自定义销毁逻辑。

说说你用过和了解过的 spring 的扩展点,项目中哪里用到了

Spring Framework 提供了许多扩展点,其中一些常见的扩展点包括:

  1. BeanPostProcessor:允许你在 Spring 容器实例化 bean 之后和初始化 bean 之前自定义 bean 的行为。通常用于 AOP 代理、属性注入等。⭐️
  2. BeanFactoryPostProcessor:允许你在所有 bean 定义加载到容器之后,但在 bean 实例化之前修改 bean 工厂的内容。通常用于修改属性值或添加属性占位符。⭐️
  3. ApplicationContextInitializer:用于在应用程序上下文初始化之前执行自定义初始化逻辑。可以用来动态地修改或初始化 Spring 应用程序上下文。⭐️
  4. ApplicationListener:用于监听 Spring 应用程序中的事件,例如上下文刷新事件、应用程序启动事件等。可以自定义处理事件的逻辑。⭐️
  5. HandlerInterceptor:用于在 Spring MVC 应用程序中对请求进行拦截和预处理。可以用于实现身份验证、日志记录等功能。⭐️
  6. ViewResolver:用于解析视图名称并将其映射到实际的视图对象。可以自定义视图解析逻辑,例如将视图名称映射到 JSP、Thymeleaf 等视图技术。
  7. MessageSource:用于国际化和本地化支持,允许你在应用程序中轻松切换不同的语言和区域设置。
  8. HandlerMethodArgumentResolver:用于自定义方法参数的解析方式,可以扩展 Spring MVC 的功能,例如解析自定义注解、自定义参数类型等。
  9. AuthenticationProvider:用于自定义身份验证逻辑,通常与 Spring Security 一起使用,用于实现自定义的身份验证策略。

在项目中,具体使用哪些扩展点取决于项目的需求和架构。例如,

  • 如果项目使用了 Spring MVC,那么可能会使用 HandlerInterceptor 来进行请求拦截和处理。
  • 如果需要自定义 Bean 的初始化过程,可能会使用 BeanPostProcessor 或 BeanFactoryPostProcessor。(手写 bean 也会用到)
  • 如果需要实现国际化支持,可能会配置 MessageSource。

spring mvc 的拦截器,servlet 的过滤器,spring gateway 的过滤器。他们几个区别是什么,都在哪些场景下用?

Spring MVC 的拦截器、Servlet 的过滤器以及 Spring Cloud Gateway 的过滤器都用于对 HTTP 请求进行预处理、拦截和处理,但它们在不同的层级和场景下使用,并具有不同的功能和特点:

  1. Spring MVC 的拦截器
    • 层级:工作在 Spring MVC 框架内部,用于拦截 Spring MVC 中的 Controller 请求。
    • 主要功能:对 Controller 层进行拦截,可以在请求到达 Controller 之前和之后执行自定义逻辑,如身份验证、日志记录、权限控制等。
    • 场景:适用于单体应用程序,用于处理请求的前置和后置逻辑,以及与 Web 应用程序相关的业务逻辑。
  2. Servlet 的过滤器
    • 层级:工作在 Servlet 容器级别,位于 Web 应用程序的请求处理管道中,可以拦截所有 Servlet 请求。
    • 主要功能:对所有 HTTP 请求进行拦截和处理,包括静态资源请求、Servlet 请求等。常用于日志记录、字符编码转换、跨域处理等通用性任务。
    • 场景:适用于任何基于 Servlet 的 Web 应用程序,用于执行通用的请求处理逻辑,无论是单体应用还是分布式应用。
  3. Spring Cloud Gateway 的过滤器
    • 层级:工作在微服务网关层级,用于处理分布式系统中的请求路由、请求转发、身份验证、限流等任务。
    • 主要功能:在微服务架构中,Gateway 充当请求的入口,通过配置一系列过滤器来执行请求处理逻辑。这些过滤器可以进行路由、权限校验、熔断、限流等功能。
    • 场景:适用于微服务架构中,用于构建高度灵活、可伸缩的 API 网关。可以实现微服务之间的请求路由、请求合并、安全验证等功能。

总的来说,这三种过滤/拦截机制各自有不同的作用范围和功能:

  • Spring MVC 的拦截器用于对 Controller 请求的拦截和处理。
  • Servlet 的过滤器用于对所有 Servlet 请求的拦截和处理。
  • Spring Cloud Gateway 的过滤器用于构建微服务架构下的 API 网关,实现请求路由和各种微服务相关的处理逻辑。

Controller 请求和 Servlet 请求之间的关系

Servlet 请求是 Web 应用程序中的原始 HTTP 请求,而 Controller 请求是 Spring MVC 中的处理器方法,用于处理特定 URL 映射的请求。

Spring MVC 使用 Servlet 容器来接收和处理 HTTP 请求,然后将请求分发给适当的 Controller 请求进行处理。

Servlet 请求包含了 Controller 请求

  • Servlet 请求是 Web 应用程序接收的原始 HTTP 请求,它包含了客户端浏览器发送的全部信息,包括请求头、请求方法、请求参数等。
  • Controller 请求是在 Spring MVC 或类似的框架中定义的处理器方法,用于处理特定 URL 映射的请求。这些方法接收 Servlet 请求作为输入,可以从中提取数据、执行业务逻辑,并生成响应。

因此,Controller 请求是在 Servlet 请求的基础上定义的,用于更方便地处理和分发请求,实现了更高级别的请求处理逻辑。
请求,然后将请求分发给适当的 Controller 请求进行处理。

Servlet 请求包含了 Controller 请求

  • Servlet 请求是 Web 应用程序接收的原始 HTTP 请求,它包含了客户端浏览器发送的全部信息,包括请求头、请求方法、请求参数等。
  • Controller 请求是在 Spring MVC 或类似的框架中定义的处理器方法,用于处理特定 URL 映射的请求。这些方法接收 Servlet 请求作为输入,可以从中提取数据、执行业务逻辑,并生成响应。

因此,Controller 请求是在 Servlet 请求的基础上定义的,用于更方便地处理和分发请求,实现了更高级别的请求处理逻辑。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python与机器学习2,激活函数

目录 1 什么是激活函数? activation function 1.1 阈值 1.2 激活函数a(x) ,包含偏置值θ 1.3 激活函数a(x) ,包含偏置值b 2 激活函数1: 单位阶跃函数 2.1 函数形式 2.2 函数图形 2.3 函数特点 2.4 代码实现这个 单位阶跃函数 3 激活…

羊大师提示,把工作和生活分开轻松拥有幸福人生

羊大师提示,把工作和生活分开轻松拥有幸福人生 工作对于每个人来说是必不可少的一部分,但是在忙碌的工作中也不能忘记了生活的美好。如何平衡好工作和生活,成为了许多人追求的目标。 我们都知道,工作和生活之间的平衡是非常重要…

【CSDN】CSDN 的简单使用与常用快捷键

【CSDN】CSDN 的简单使用与常用快捷键 1)目录2)标题3)代码块4)黑点标题5)字体5.1.加粗5.2.标记5.3.颜色 6)图片6.1.居中6.2.左对齐6.3.右对齐6.5.图片大小调整 1)目录 创建标题目录快捷键&…

PFA微柱实验用同位素离子交换柱耐强酸碱

PFA同位素离子交换柱是一种常用于分离和富集同位素的柱子。离子交换柱的工作原理是通过固定的离子交换基质,将目标同位素离子与其他离子相互交换,从而实现分离的目的。 PFA同位素离子交换柱用于同位素的分析和测量。在样品中,不同同位素的离子…

hive企业级调优策略之小文件合并

测试所用到的数据参考: 原文链接:https://blog.csdn.net/m0_52606060/article/details/135080511 本教程的计算环境为Hive on MR。计算资源的调整主要包括Yarn和MR。 优化说明 小文件合并优化,分为两个方面,分别是Map端输入的小…

C/C++编程:令人印象深刻的高级技巧案例

C/C编程语言在软件开发领域有着悠久的历史,由于其高效、灵活和底层访问能力,至今仍然被广泛应用。本文将介绍一些在C/C编程中令人印象深刻的高级技巧,帮助读者提升编程水平,更加高效地使用这两种强大的编程语言。 一、指针运算与…

针对企业的泄密,天锐绿盾提出十大解决方案

01 防止公司内部数据泄密 通过动态加解密技术,有效防止公司内部数据泄密。即员工在创建、编辑文档时会被自动加密存放在硬盘上,防止员工故意或由于疏忽而造成泄密或对文件恶意破坏。 管理思路>> ● 不改变员工使用习惯、不改变文件格式、不改变…

vite与webpack?

vite对比react-areate-app 1、构建速度 2、打包速度 3、打包文件体积

html行内元素和块级元素的区别?

HTML中的元素可以分为两种类型:行内元素(inline)和块级元素(block) 文章目录 什么是行内元素什么是块级元素元素转换行内元素转块级元素块级元素转行内元素 区别总结 什么是行内元素 HTML的行内元素(inli…

MATLAB - Gazebo 仿真环境

系列文章目录 前言 机器人系统工具箱(Robotics System Toolbox™)为使用 Gazebo 模拟器可视化的模拟环境提供了一个界面。通过 Gazebo,您可以在真实模拟的物理场景中使用机器人进行测试和实验,并获得高质量的图形。 Gazebo 可在…

promise:一文理解promise常用的方法

目录 第一章 介绍promise 1.1 简介 1.2 什么是地域回调 第二章 promise理论 2.1 promise的状态 2.2 promise对象的值 2.3 promise构造函数 2.4 Promise.resolve()与Promise.reject() 2.5 promise常用的几种方法 2.5.1 Promise.all(promises) 2.5.2 Promise.race(pr…

Elasticsearch的使用总结

Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。 put/post请求:http://localhost:9200/索引库名称 {"settings":{"index":{"number_of_shards":1, # 分片数量…

HQL的其他优化

CBO优化 CBO是指Cost based Optimizer,即基于计算成本的优化。 在Hive中,计算成本模型考虑到了:数据的行数、CPU、本地IO、HDFS IO、网络IO等方面。Hive会计算同一SQL语句的不同执行计划的计算成本,并选出成本最低的执行计划。目前…

在Java中高效使用Lambda表达式和流(Streams)的技巧

Java中如何高效使用Lambda表达式和流(Streams)的技巧 1. 简介 在Java中,Lambda表达式和流(Streams)是Java 8引入的两个强大的特性。Lambda表达式为Java添加了一种简洁的方式来实现函数式编程,而流提供了一…

056:vue工具 --- CSS在线格式化

第056个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下,本专栏提供行之有效的源代码示例和信息点介绍,做到灵活运用。 (1)提供vue2的一些基本操作:安装、引用,模板使…

【Unity 实用工具篇】✨| I2 Localization 实现本地化及多种语言切换,快速上手

前言【Unity 实用工具篇】| I2 Localization 实现本地化及多种语言切换,快速上手一、多语言本地化插件 I2 Localization1.1 介绍1.2 效果展示1.3 使用说明及下载二、插件资源简单介绍三、通过示例快速上手3.1 添加 Languages语种3.2 添加 Term资源3.3 静

如何确保对称密钥管理的存储安全?

确保对称密钥管理的存储安全是保障信息安全的重要一环。以下是一些建议,以确保对称密钥管理的存储安全: 使用安全存储设备:选择使用经过验证的安全存储设备来存储对称密钥。这些设备通常具有高度的物理安全性,可以防止未经授权的访…

【CLion】使用CLion开发STM32

本文主要记录使用CLion开发STM32,并调试相关功能 使用的CLion版本:2023.3.1 CLion嵌入式配置教程:STM32CubeMX项目 |CLion 文档 (jetbrains.com) OpenOCD官网下载:Download OpenOCD for Windows (gnutoolchains.com) GNU ARM工…

面试每日三题

MySQL篇 MySQL为什么使用B树索引 B树每个节点可以包含关键字和对应的指针,即B树的每个节点都会存储数据,随机访问比较友好,B树的叶子节点之间是无指针相连接的 B树所有关键字都存储在叶子节点上,非叶子节点只存储索引列和指向子…

【算法Hot100系列】删除链表的倒数第 N 个结点

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…