SpringBoot手册

news2025/1/11 7:56:52

目录

  • 依赖管理
  • 关于各种的 start 依赖
  • 关于自动配置
  • 关于约定大于配置中的配置
  • SpringBoot 整合 SpringMVC
    • 定制化 SpringMVC
    • 静态资源处理
    • 对上传文件的处理
    • 对异常的处理
    • Web原生组件注入(Servlet、Filter、Listener)
    • Interceptor 自定义拦截器
    • DispatcherServlet 配置映射路径
    • 定制 内嵌的 服务器
    • 定制化总结

依赖管理

  • 每个刚创建的 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)

  1. 通过注解 @WebFilter、@WebServlet、@WebListener
  2. 通过 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 依赖,再导入其它服务器的依赖
    在这里插入图片描述

定制化总结

在这里插入图片描述

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

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

相关文章

【iOS】GCD学习

GCD的概念 GCD&#xff08;Grand Central Dispatch&#xff09;&#xff0c;是有Apple公司开发的一个多核编程的解决方案&#xff0c;用以优化应用程序支持多核处理器&#xff0c;是基于线程模式之上执行并发任务。 GCD的优点 利用设备多核进行并行运算GCD自动充分使用设备的…

C语言-学习之路-03

C语言-学习之路-03 程序流程结构选择结构if语句if...else...语句三目运算符switch语句 循环结构while语句do...while语句for语句嵌套循环 跳转语句break、continue、gotobreak语句continue语句goto语句 程序流程结构 C语言支持最基本的三种程序流程结构&#xff1a;顺序结构、…

三、SpringMVC

三、SpringMVC 1、SpringMVC简介 1.1、什么是MVC MVC是一种软件架构的思想&#xff0c;将软件按照模型、视图、控制器来划分 M&#xff1a;Model&#xff0c;模型层&#xff0c;指工程中的JavaBean&#xff0c;作用是处理数据 JavaBean分为两类&#xff1a; 一类称为实体…

REST API 详解

REST API REST&#xff08;Representational State Transfer&#xff0c;表述性状态转移&#xff09;是一种用于构建分布式系统的架构风格。REST API&#xff08;Application Programming Interface&#xff0c;应用程序接口&#xff09;是一种基于REST风格的网络API&#xff…

Filter 过滤器

Filter过滤器介绍 这里我们讲解Filter的执行流程&#xff0c;从下图可以大致了解到&#xff0c;当客户端发送请求的时候&#xff0c;会经过过滤器&#xff0c;然后才能到我们的servlet&#xff0c;当我们的servlet处理完请求之后&#xff0c;我们的response还是先经过过滤器才…

Packet Tracer - 配置交换机端口安全

Packet Tracer - 配置交换机端口安全 地址分配表 设备 接口 IP 地址 子网掩码 S1 VLAN 1 10.10.10.2 255.255.255.0 PC1 NIC 10.10.10.10 255.255.255.0 PC2 NIC 10.10.10.11 255.255.255.0 非法笔记本电脑 NIC 10.10.10.12 255.255.255.0 目标 第 1 部…

MySQL监控告警及可视化:Zabbix+Percona PMP实现(Part I)

MySQL监控告警及可视化&#xff1a;ZabbixPercona PMP实现&#xff08;Part I&#xff09; 准备工作Zabbix Server安装Zabbix Server配置conf文件配置系统服务配置Web服务配置 Zabbix Agent安装Zabbix Agent配置conf文件配置系统服务配置 准备工作 &#x1f42c;软件下载&#…

ChatGPT提示词工程(五):Transforming转换

目录 一、说明二、安装环境三、转换&#xff08;Transforming&#xff09;1. 翻译 Translation2. 语气转换 Tone Transformation3. 格式转换 Format Conversion4. 拼写或语法检查 Spellcheck/Grammar check 一、说明 这是吴恩达 《ChatGPT Prompt Engineering for Developers》…

kubernetes安全框架RBAC

目录 一、Kubernetes 安全概述 二、鉴权、授权和准入控制 2.1 鉴权(Authentication) 2.2 授权(Authorization) 2.3 准入控制 三、基于角色的权限访问控制&#xff1a; RBAC 四、案例&#xff1a;为指定用户授权访问不同命名空间权限 一、Kubernetes 安全概述 K8S安全控…

YOLOv5 txt标签转图像标签(多个标签)

Python YOLOv5 txt标签转图像标签&#xff08;多个标签 txt的数据如图所示1.读原始图像以及对应的txt文件2.获得原始图像的大小3.生成一张大小相同&#xff0c;黑色背景的图片4.读取txt文件&#xff0c;循环的增加标签5.获得不规则图形&#xff08;标签&#xff09;6.完整代码7…

Linux运维:makefile

一.makefile 1.makefile介绍 Makefile 是一种用于自动化构建的文件&#xff0c;它描述了一个软件项目的编译规则和依赖关系&#xff0c;并提供了一些工具来自动执行这些规则。 Makefile 的主要作用如下&#xff1a; 自动化编译&#xff1a;通过 Makefile&#xff0c;可以定…

使用 nvcc 的时候出现“helper_cuda.h”: No such file or directory错误该怎么办(其他xxx.h也是同样的解决方法)

今天在命令行中使用nvcc的时候&#xff0c;出现了“helper_cuda.h”: No such file or directory错误。这个错误信息表示&#xff1a;在编译的时候&#xff0c;找不到helper_cuda.h头文件&#xff08;其他xxx.h如果也找不到&#xff0c;那么下面的解释和解决方法也通用&#xf…

Java流式操作——Collectors工具类

文章目录 方法实践说明一、前提条件Person类Data类 二、操作maxBy&#xff1a;获取流中最大元素&#xff1b;minBy&#xff1a;获取流中最小元素joining:合并&#xff0c;将流中的元素&#xff0c;以字符串的形式拼接起来summingInt:把流中的元素映射成int类型的元素&#xff0…

springboot第14集:MyBatis-CRUD讲解

注意点&#xff1a;增、删、改操作需要提交事务&#xff01; 为了规范操作&#xff0c;在SQL的配置文件中&#xff0c;我们尽量将Parameter参数和resultType都写上&#xff01; 编写Mapper接口类 import com.da.pojo.User; import java.util.List; public interface UserMapper…

4.1 指令系统的发展与性能要求

学习目标&#xff1a; 指令系统的发展与性能要求的学习目标&#xff1a; 理解指令系统的发展历程&#xff0c;包括CISC、RISC、VLIW等架构的特点、优缺点以及应用领域&#xff1b;掌握指令系统的性能要求&#xff0c;包括指令集的多样性、可编程性、并行性、效率、可靠性等&a…

ChatGPT学习-如何向ChatGPT提问

​ 最近在学习chatGPT,怎么样的提问是一个好的提问。通过网上找资料肯定不是最好的方法&#xff0c;我想起一句话&#xff0c;“不识庐山真面目&#xff0c;只缘身在此山中”。最好的老师就是chatGPT&#xff01; 下面先展示下提问成果&#xff0c;我通过xmind生成了思维导图 一…

为什么越来越多的企业选择云计算

目录 一、前言 二、云计算的基础概念 2.1 云计算的定义 2.2 云计算的发展历程 2.3 云计算的基本架构 三、 企业采用云计算的优势 四、 行业应用案例 五、未来发展与挑战 六、总结 随着数字化转型的加速&#xff0c;越来越多的企业开始选择云计算作为信息技术应用的基础…

Linux 用户管理与文件权限

Linux 是一个多用户系统&#xff0c;它允许多个用户同时登陆主机&#xff0c;并为他们分配不同的资源和工作环境进行使用。当然&#xff0c;不同的用户都有文件的私有需求&#xff0c;所以设置不同用户文件的权限管理十分重要。 01 用户与用户组 Linux 中一般将文件访问权限的…

【matplotlib】可视化解决方案——如何正确设置图例

概述 matplotlib 中的图例&#xff08;Legend&#xff09;可以帮助我们展示每个数据对应的名称&#xff0c;让图像阅读者更好的认识到图像的数据结构以及绘图者想表达的意思。matplotlib 可以为每一个可见绘图对象&#xff08;Artist&#xff09;添加图例&#xff0c;官方建议…

windows10系统如何实现telnet内网穿透

在windows10系统环境中&#xff0c;我们常用的内网穿透方案是远程桌面内网穿透技术方案&#xff0c;存在的弊端是它属于视窗类操作工具。网上很多教人开启windows10的telnet服务的帖子&#xff0c;凡是通过系统设置进入启用或关闭windows应用后勾选telnet客户端这种方式&#x…