SpringBoot手册
目录
- 依赖管理
- 关于各种的 start 依赖
- 关于自动配置
- 关于约定大于配置中的配置
- SpringBoot 整合 SpringMVC
- 定制化 SpringMVC
- 静态资源处理
- 对上传文件的处理
- 对异常的处理
- Web原生组件注入(Servlet、Filter、Listener)
- Interceptor 自定义拦截器
- DispatcherServlet 配置映射路径
- 定制 内嵌的 服务器
- 定制化总结
- SpringBoot 整合 Mybatis
- SpringBoot 整合 MybatisPlus
依赖管理
- 每个刚创建的 SpringBoot 项目的 pom 文件都有
spring-boot-starter-parent
依赖,然后它还有一个父依赖spring-boot-dependencies
spring-boot-dependencies
决定了 SpringBoot 项目的依赖版本,但是如果不遵循也是可以的,可以自己导入新的依赖版本- 如果遵循 SpringBoot 的版本,引入相应的依赖的时候,依赖的坐标就可以不标明版本号了
关于各种的 start 依赖
- 导入这些 start 依赖,就是导入了和这个 start 依赖 有关的组件的所有相关依赖,然后再通过 SpringBoot 的自动配置,做到开箱即用
关于自动配置
- 自动配置主要看 启动类 的注解
@SpringBootApplication
,其中最主要的是注解@EnableAutoConfiguration
,这个注解又包含@AutoConfigurationPackage、@Import(AutoConfigurationImportSelector.class)
@AutoConfigurationPackage
包含@Import(AutoConfigurationPackages.Registrar.class)
,其中AutoConfigurationPackages.Registrar.class
的作用就是得到 启动类 所在的包路径,然后扫描包路径下的所有 类 ,该添加到容器的添加,不该添加的忽略@Import(AutoConfigurationImportSelector.class)
的关键就是AutoConfigurationImportSelector.class
,这个类是实现自动配置的主要入口,主要的逻辑顺序是org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#getCandidateConfigurations
>org.springframework.core.io.support.SpringFactoriesLoader#loadFactoryNames
>org.springframework.core.io.support.SpringFactoriesLoader#loadSpringFactories
- 经过上面的调用步骤,最终关键的就是
classLoader.getResources("META-INF/spring.factories")
,所以实现自动配置,就是扫描引入依赖的类路径下的spring.factories
中的内容,这个文件中的类容就是各种配置类
- 随便点开一个自动配置类,就会发现各种
@Bean、@Conditional、@EnableConfigurationProperties、@ConditionalOnMissingBean...
,这些注解就是自动配置的关键,满足条件就会注册到容器中,并且还会带默认的配置,这就是开箱即用,约定大于配置
关于约定大于配置中的配置
- 前面已经知道自动配置的来源就是各种自动配置类,以 SpringMVC 的相关的自动配置类 WebMvcAutoConfiguration 为例,可以观察到类似
@EnableConfigurationProperties({WebProperties.class})、@ConditionalOnProperty( prefix = "spring.mvc.problemdetails", name = {"enabled"},havingValue = "true" )、@ConditionalOnProperty(prefix = "spring.mvc.formcontent.filter", name = {"enabled"},matchIfMissing = true)...
- 通过这样带有配置关键字的注解,可以发现要么在注解上就标明了配置内容和默认值,要么就是通过 xxxProperties 这样的类,其中内容也大多是如图所示的内容,可以发现就是一些配置文件里面的内容,如果没有配置也会有默认值
SpringBoot 整合 SpringMVC
定制化 SpringMVC
- 定制化功能,主要通过观察 SpringMVC 的自动配置类
- 通过实现
WebMvcConfigurer
接口作为配置类,添加自定义的功能
- 通过在配置类中 创建
HiddenHttpMethodFilter
的实例到容器,自定义 HiddenHttpMethodFilter- 需要先开启配置
spring.mvc.hiddenmethod.filter.enabled=true
- 需要先开启配置
- 在配置类上使用
@EnableWebMvc
意味着完全自定义 SpringMVC 相当于回到最原始的 web 程序开发
静态资源处理
- 静态资源处理,已经默认开启
spring.resources.add-mappings=true
- 默认的静态资源路径如下,参照 自动配置类
WebMvcAutoConfiguration
引入了webMvcProperties
的属性配置
- 自定义静态资源路径
spring.resources.static-locations={ "classpath:/META-INF/resources/","classpath:/resources/", "classpath:/static/", "classpath:/public/" }
- 自定义静态资源请求路径映射
spring.mvc.static-path-pattern="/**"
,默认就是"/**"
- 让客户端缓存静态资源
spring.resources.cache.period=10000
单位是s
对上传文件的处理
- SpringBoot 默认已经配置好 文件上传需要的 依赖和配置
- 但是还是要设置文件的大小配置的
# 单个文件的最大限制
spring.servlet.multipart.max-file-size=10MB
# 整个请求的最大限制
spring.servlet.multipart.max-request-size=100MB
对异常的处理
- 对异常的处理,SpringBoot 已经有了默认的配置
- 直接 在静态资源路径 添加 错误码.html,如5xx.html,就对应5开头的错误码,比如500,这种方式利用了默认配置,改变的只是错误的展示页面,使用的是 DefaultHandlerException—>DefaultErrorViewResolver
- 直接 创建一个 名字是
ErrorController
的处理器,这种方式,错误的处理和页面跳转完全由开发者控制 - 直接 在配置类中 创建一个
ErrorAttributes
的实例,这种方式只是修改了错误的提示信息,依然还是使用 DefaultHandlerException—>DefaultErrorViewResolver
- 自定义实现 HandlerExceptionResolver 处理异常,可以作为默认的全局异常处理规则
- @ControllerAdvice+@ExceptionHandler处理全局异常,底层是 ExceptionHandlerExceptionResolver 支持的
/*** 处理整个web controller的异常*/
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler({ArithmeticException.class,NullPointerException.class}) //处理异常public String handleArithException(Exception e){log.error("异常是:{}",e);return "login"; //视图地址}
}
- @ResponseStatus + 自定义异常,实际上是交给
ResponseStatusExceptionResolver
处理,最终由 Tomcat 发送错误信息返回前端,只改变了错误信息,而且使用的是最原始的 Tomcat 错误页面
@ResponseStatus(value= HttpStatus.FORBIDDEN,reason = "用户数量太多")
public class UserTooManyException extends RuntimeException {public UserTooManyException(){}public UserTooManyException(String message){super(message);}
}
Web原生组件注入(Servlet、Filter、Listener)
- 通过注解 @WebFilter、@WebServlet、@WebListener
- 通过 Servlet、Filter、Listener 它们的子类,然后在配置类中注册
Interceptor 自定义拦截器
- 自定义的拦截器,对于自定义的
servlet
不起作用,因为 拦截器起作用是建立在 DispatcherServlet 的代码逻辑上的org.springframework.web.servlet.DispatcherServlet#doDispatch ---> org.springframework.web.servlet.HandlerExecutionChain#applyPreHandle
DispatcherServlet 配置映射路径
- 在 SpringBoot 中
DispatcherServlet
通过DispatcherServletAutoConfiguration-->DispatcherServletRegistrationBean-->ServletRegistrationBean
完成注册到容器,使用的是webMvcProperties
的属性配置 - 修改映射路径
spring.mvc.servlet.path="/"
,默认配置也是"/"
定制 内嵌的 服务器
- 程序启动会创建一个 web 版的IoC容器
ServletWebServerApplicationContext
,其逻辑是org.springframework.boot.web.embedded.xxxxx.xxxxServletWebServerFactory#getWebServer<---org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext#getWebServerFactory<--ServletWebServerFactory
xxxx
就是下面步骤获得的服务器工厂的服务器名org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration--->org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryConfiguration-->根据导入的依赖决定是那种服务器的 ServletWebServerFactory
- 其中服务器工厂的自动配置类,决定了我们对服务器的个性化配置的方式,要么修改配置文件
ServerProperties
、要么模仿ServletWebServerFactoryCustomizer
实现org.springframework.boot.web.server.WebServerFactoryCustomizer#customize
- SpringMVC 的 start 默认是导入 Tomcat 依赖的,如果想要换服务器,应该先排除 Tomcat 依赖,再导入其它服务器的依赖
定制化总结
SpringBoot 整合 Mybatis
- 在不使用多数据源的情况下,直接从 github 上导入依赖
mybatis-spring-boot-starter
- 通过依赖中的 自动配置类 配置相关的属性,通过观察自动配置类,发现 会自动扫描 加了
@Mapper
的 Mapper 接口,并注册代理对象到容器中,也可以通过在配置类or启动类上添加@MapperScan
,避免每个 Mapper 接口都要加@Mapper
- 两种配置方式:1.配置文件(xm,config-locationl)、2.配置文件(yum/properties,configuration),两种方式只能选择一种
# 配置mybatis规则
mybatis:
# config-location: classpath:mybatis/mybatis-config.xmlmapper-locations: classpath:mybatis/mapper/*.xmlconfiguration:map-underscore-to-camel-case: tru
- 可以实现全注解开发,不需要映射文件(xml),直接在 Mapper 接口的方法上添加对应的注解,如
@Select
对应映射文件中select
标签、@Option
对应各种语句标签的属性,如@Option(useGeneratedKeys = true,keyProperty = "id")
SpringBoot 整合 MybatisPlus
相关文章:

SpringBoot手册
目录 依赖管理关于各种的 start 依赖关于自动配置关于约定大于配置中的配置SpringBoot 整合 SpringMVC定制化 SpringMVC静态资源处理对上传文件的处理对异常的处理Web原生组件注入(Servlet、Filter、Listener)Interceptor 自定义拦截器DispatcherServlet…...

【Linux】如何实现单机版QQ,来看进程间通信之管道
学会了管道,就可以实现简单的qq哦~ 文章目录 前言一、匿名管道总结 前言 为什么要进行进程间通信呢?因为需要以下这些事: 数据传输:一个进程需要将它的数据发送给另一个进程 资源共享:多个进程之间共享同样的资源。 …...

从一到无穷大 #6 盘满排查过程
文章目录 引言df/du 原理排查思路文件系统预留空间进程占用句柄挂载覆盖 引言 核心在于执行df和du的时候发现显示的存储量完全不同,我本地系统盘有99G空间,du显示占用了45G,但是df却显示使用了99G,排查的过程本文所示。 先记录几…...
ChatGPT技术原理 第九章:数据集和训练技巧
目录 9.1 对话数据集 9.2 数据预处理 9.3 预训练技巧 9.4 微调技巧 9.5 多任务学习...

NCR被攻击后服务中断!原是BlackCat勒索软件作祟
近日,在遭到BlackCat勒索软件攻击后,NCR 的 Aloha 销售点平台出现中断。 NCR公司是全球关系管理技术解决方案领导供应商,为全球零售、金融、传讯、制造、旅游、交通及保安等客户提供服务。凭著累积多年的业界知识、专业顾问经验、专业增值应用…...

带你认识什么是BMS(电池管理系统)
文章目录 概述BMS的硬件拓扑BMS的电气架构BMS的功能BMS的总压采集(主板功能)BMS的电流采集(主板功能)BMS的电芯电压和温度采集(从板功能)BMS的SOC、SOP和SOH(ASW计算)BSM的绝缘检测B…...

安装Ubuntu22.04虚拟机的一些常见问题解决方法
文章目录 VirttalBox 开启共享剪切板文件夹、拖放的功能VirtualBox 安装 ubuntu后安装增强工具无效的解决办法解决ubuntu您没有权限查看“ 某某文件夹”的内容所需的权限linux更换源的两种方法[如何在 Ubuntu 20.04 上安装 Visual Studio Code - ](https://zhuanlan.zhihu.com/…...

银河麒麟操作系统,安装Gitlab 基于docker
不废话。直接上干货 操作系统信息 ############## Kylin Linux Version ################# Release: Kylin Linux Advanced Server release V10 (Sword) Kernel: 4.19.90-24.4.v2101.ky10.aarch64 Build: Kylin Linux Advanced Server release V10 (SP2) /(Sword)-aarch64-…...

基于Python实现个人手机定位分析
TransBigData是一个为交通时空大数据处理、分析和可视化而开发的Python包。本文就来用它实现个人手机定位分析,感兴趣的小伙伴可以了解一下 但其实交通时空大数据并不仅仅局限于交通工具产生的数据,我们的日常生活中也会产生大量的数据。比如我们的手机…...
Unity Navgation系统杂记
立即停止寻路 使用agent.isStoppedtrue,可以停止寻路,但是有很大的延迟,视觉体验很不好。 使用agent.enabledfalse,通过禁用NavMeshAgent组件的方式实现立即停止寻路。因为组件被禁用可能会产生其它问题,比如失去了Ob…...

[2021.11.9]lighteffect架构优化详细设计文档
1 lighteffect系统架构图 图1-1 整改前lighteffect系统架构图 上图为整改前lighteffect系统架构图,存在的问题如下: (1)代码bug 原因:由于系统中兼容了lighteffect和lighteffect2,写代码时只记了一个,出现代码bug。…...

经典回归算法
回归的概念 回归方程: 写成矩阵: 核心问题,构建预测函数z来映射特征矩阵x和标签y的线性关系 预测的目标值,有连续值也有离散值 连续值,就直接预测输出就行离散值,需要在输出端加一个变换函数例如。Si…...

Python两三行代码轻松批量添加~防韩还是很有必要的~
人生苦短,我用python 一直想做一个这种系列的但是因为七七八八的事情总是忘记, 今天正好有空,来开整一下~ 首先, 天冷防韩是什么梗? 【天冷防韩】 “天冷防韩”是“天冷防寒”的谐音, 不过“寒”指的…...
开心消消乐
给定一个 N 行 M 列的二维矩阵,矩阵中每个位置的数字取值为 0 或 1,矩阵示例如: 1 1 0 0 0 0 0 1 0 0 1 1 1 1 1 1 现需要将矩阵中所有的 1 进行反转为 0,规则如下: 当点击一个 1 时,该 1 被反转为 0&am…...

有效日志管理在软件开发和运营中的作用
作者:Luca Wintergerst, David Hope, Bahubali Shetti 当今存在的快速软件开发过程需要扩展和复杂的基础架构和应用程序组件,并且操作和开发团队的工作不断增长且涉及多个方面。 有助于管理和分析遥测数据的可观察性是确保应用程序和基础架构的性能和可靠…...

【五一创作】【笔记】Git|如何将仓库中所有的 commit 合成一个?又名,如何清除所有 git 提交记录?(附 git rebase 机制的简要分析)
在对代码进行开源时,我们往往并不希望代码开发过程中的提交记录被其他人看到,因为提交的过程中往往会涵盖一些敏感信息。因此会存在 将仓库中所有 commit 合成一个 的需求。 直觉上,往往会用 rebase 和 squash 或 reset,不过我尝…...
如何写出高质量代码?
作为一名资深开发人员,写出高质量的代码是我们必须要追求的目标。然而,在实际开发中,我们常常会遇到各种问题。比如,代码的可读性、可维护性、健壮性和灵活性等,这些都会影响代码的质量。那么,究竟如何才能…...

外卖项目优化-01-redis缓存短信验证码、菜品数据、Spring Cache(注解开发缓存)、(注解开发)缓存套餐数据
文章目录 外卖项目优化-01课程内容前言1. 环境搭建1.1 版本控制解决branch和tag命名冲突 1.2 环境准备 2. 缓存短信验证码2.1 思路分析2.2 代码改造2.3 功能测试 3. 缓存菜品信息3.1 实现思路3.2 代码改造3.2.1 查询菜品缓存3.2.2 清理菜品缓存 3.3 功能测试3.4 提交并推送代码…...
Chapter1:控制系统数学模型(下)
第一章:控制系统数学模型 Exercise1.13 已知控制系统结构图如下图所示,求系统的输出 C 1 ( s ) C_1(s) C...

排序算法总结
常见排序算法的时间复杂度、空间复杂度及稳定性分析: 时间复杂度空间复杂度是否有稳定性基于比较的排序算法选择排序 O(N^2)O(1)否 冒泡排序O(N^2)O(1)是插入排序O(N^2)O(1)是归并排序O(N*logN)O(N),每次需要额外一个数组用于拷贝是快排O(N*log…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...

华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...

在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...

向量几何的二元性:叉乘模长与内积投影的深层联系
在数学与物理的空间世界中,向量运算构成了理解几何结构的基石。叉乘(外积)与点积(内积)作为向量代数的两大支柱,表面上呈现出截然不同的几何意义与代数形式,却在深层次上揭示了向量间相互作用的…...