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…...
终极指南:如何用SlopeCraft在5分钟内创建惊艳的Minecraft立体地图画
终极指南:如何用SlopeCraft在5分钟内创建惊艳的Minecraft立体地图画 【免费下载链接】SlopeCraft Map Pixel Art Generator for Minecraft 项目地址: https://gitcode.com/gh_mirrors/sl/SlopeCraft 你是否梦想过将现实世界的照片、艺术作品甚至个人照片转化…...
别再只会用Burpsuite了!手把手教你用Python脚本+Crunch字典搞定DVWA暴力破解
从零构建Python自动化爆破工具:DVWA全等级攻防实战解析 在渗透测试领域,暴力破解(Brute Force)始终是验证系统弱口令防御的基础手段。虽然Burpsuite这类图形化工具降低了入门门槛,但真正理解底层通信原理并构建自定义攻击脚本,才是…...
lingbot-depth-pretrain-vitl-14效果展示:多光照/反光表面深度补全自然边缘案例
lingbot-depth-pretrain-vitl-14效果展示:多光照/反光表面深度补全自然边缘案例 1. 引言:当深度图遇上“反光杀手” 你有没有遇到过这种情况?用深度相机扫描一个光滑的桌面,或者对着窗户拍一张照片,结果生成的深度图…...
罗技鼠标宏终极指南:如何用Lua脚本实现绝地求生无后座力射击
罗技鼠标宏终极指南:如何用Lua脚本实现绝地求生无后座力射击 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 想要在《绝地求生》中实…...
Rustup工具链管理深度解析:多版本Rust环境实战指南
Rustup工具链管理深度解析:多版本Rust环境实战指南 【免费下载链接】rustup The Rust toolchain installer 项目地址: https://gitcode.com/gh_mirrors/ru/rustup Rustup作为Rust语言的官方工具链管理器,为开发者提供了稳定、测试版和夜间版多版本…...
多模态扩展:OpenClaw结合Qwen3.5-4B-Claude处理截图信息
多模态扩展:OpenClaw结合Qwen3.5-4B-Claude处理截图信息 1. 为什么需要多模态能力 作为一个长期依赖文本交互的技术爱好者,我最初对OpenClaw的理解停留在"能通过自然语言控制电脑的AI助手"层面。直到上个月需要处理大量产品截图中的文字信息…...
SiameseUIE在CSDN社区的应用:技术文章智能分析
SiameseUIE在CSDN社区的应用:技术文章智能分析 1. 引言 CSDN社区每天都有成千上万的技术文章发布,涵盖了从编程语言到人工智能的各个领域。面对如此庞大的内容量,如何快速准确地理解每篇文章的核心内容、自动生成标签、进行智能分类&#x…...
Janus-Pro-7B开源大模型教程:HuggingFace模型路径本地加载实操
Janus-Pro-7B开源大模型教程:HuggingFace模型路径本地加载实操 1. 引言 如果你正在寻找一个既能看懂图片,又能根据文字生成图片的AI模型,那么Janus-Pro-7B绝对值得你花时间了解一下。这个模型最近在开源社区里挺火的,因为它把“…...
还在为多平台资源下载烦恼?这款工具让你一站式搞定网络内容保存
还在为多平台资源下载烦恼?这款工具让你一站式搞定网络内容保存 【免费下载链接】res-downloader 资源下载器、网络资源嗅探,支持微信视频号下载、网页抖音无水印下载、网页快手无水印视频下载、酷狗音乐下载等网络资源拦截下载! 项目地址: https://gi…...
【图像计数】基于matlab GUI图像处理颗粒自动计数【含Matlab源码 15231期】
💥💥💥💥💥💥💞💞💞💞💞💞💞💞欢迎来到海神之光博客之家💞💞💞Ὁ…...
