SpringBoot1~~~
目录
快速入门
依赖管理和自动配置
修改自动仲裁/默认版本号
starter场景启动器
自动配置
修改默认扫描包结构
修改默认配置
读取application.properties文件
按需加载原则
容器功能
@Configuration
@Import
编辑
@Conditional
@ImportResource
配置绑定@ConfigurationProperties
Lombok
yaml
基本语法
数据类型
应用
细节
静态资源访问
Rest风格请求处理
接收参数相关注解
@PathVariable、@RequestParam
@RequestHeader
@CookieValue
@RequestBody
@RequestAttribute、@SessionAttribute
复杂参数
自定义对象参数-自动封装
自定义转换器
实现接口形式
向容器注入Bean形式
处理Json
内容协商
Thymeleaf
拦截器
实现接口形式
向容器注入Bean形式
文件上传
第一种
第二种
快速入门
jdk8+,maven3.5+
<!--导入springboot父工程--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.3</version></parent><!--导入web项目场景启动器:会自动导入和web开发相关的所有依赖--><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>
//表示这是一个springboot应用/项目
@SpringBootApplication
public class MainApp {public static void main(String[] args) {SpringApplication.run(MainApp.class,args);//或者ConfigurableApplicationContext ioc= SpringApplication.run(MainApp.class, args);}
}
@Controller
public class HelloController {@RequestMapping("/hello")@ResponseBodypublic String hello() {return "hello";}
}
依赖管理和自动配置
修改自动仲裁/默认版本号
spring-boot-starter-parent 还有父项目, 声明了开发中常用的依赖的版本号,并且进行 自动版本仲裁 , 即如果程序员没有指定某个依赖jar的版本,则以父项目指 定的版本为准
在pom.xml修改版本号
starter场景启动器
开发中我们引入了相关场景的starter,这个场景中所有的相关依赖都引入进来了
比如我们做web开发引入了,该starter将导入与web开发相关的所有包
<!--导入web项目场景启动器:会自动导入和web开发相关的所有依赖--><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>
依赖树:可以看到spring-boot-starter-web ,帮我们引入了spring-webmvc,spring-web 开发模块,还引入了spring-boot-starter-tomcat 场景,spring-boot-starter-json 场景,这些场景下面又引入了一大堆相关的包,这些依赖项可以快速启动和运行一个项目,提高开发效率
所有场景启动器最基本的依赖就是spring-boot-starter,这个依赖也就是SpringBoot自动配置的核心依赖
官方/第三方strater
自动配置
扫描包:默认主程序(MainApp)所在的包及其子包下会被扫描
修改默认扫描包结构
scanBasePackages指定扫描的包,com.edu这个包及子包会被扫描
@SpringBootApplication(scanBasePackages = {"com.edu","aa.bb"})
public class MainApp {public static void main(String[] args) {SpringApplication.run(MainApp.class,args);}
}
修改默认配置
1、在resources目录下创建application.properties文件,更改value
2、在application.properties文件中自定义配置,通过@Value("${}")获取对应属性值
读取application.properties文件
也可以放在resource目录下的config目录下、项目路径下
public class ConfigFileApplicationListener {private static final String DEFAULT_SEARCH_LOCATIONS = "classpath:/,classpath:/config/,file:./,file:./config/*/,file:./config/";private static final String DEFAULT_NAMES = "application";
}
按需加载原则
自动配置遵守按需加载原则:引入了哪个场景starter就会加载该场景关联的jar 包,没有引入的starter 则不会加载其关联jar
SpringBoot 所有的配置功能都在spring-boot-autoconfigure 包里面
容器功能
Sping注入组件的注解仍可以在SpringBoot使用
@Configuration
传统:通过配置文件注入组件
使用@Configuration添加/注入组件,创建配置类来注入组件
前提:在springboot扫描的包/子包下会注入到容器
1. @Configuration 标识这是一个配置类, 等价于配置文件
2. 可以通过@Bean 注解注入bean对象到容器3.当一个类被@Configuration标识,该类-Bean也会注入容器,可以被获取
@Configuration
public class BeanConfig {//name的值指定bean的id,不指定id就是方法名@Bean(name = "monster")public Monster monster01() {return new Monster(200,"tom",18,"dance");}
}
SpringBoot2 新增特性: proxyBeanMethods 指定 Full 模式 和 Lite模式
proxyBeanMethods:代理bean的方法
(1) Full(proxyBeanMethods = true)(默认)【保证每个@Bean 方法被调用多少次返回的组件都是单实例的, 是代理方式】
(2) Lite(proxyBeanMethods = false)【每个@Bean 方法被调用多少次返回的组件都是新创 建的, 是非代理方式】
(3) 特别说明: proxyBeanMethods 是在调用@Bean方法才生效,因此,需要先获取 BeanConfig 组件,再调用方法;而不是直接通过 SpringBoot 主程序得到的容器来获取 bean, 注意观察直接通过 ioc.getBean() 获取 Bean, proxyBeanMethods 值并没有生效
(4) 如何选择: 组件依赖必须使用Full模式,如果不需要组件依赖使用Lite模式
(5) Lite模式也称为轻量级模式,因为不检测依赖关系,运行速度快
容器只有一个,配置类可以有多个, 就和Spring可以有多个ioc配置文件是一个道理
@Import
使用@Configuration可以将Bean注入到容器
也可以在配置类上使用@Import,就不必写具体的方法
默认id就是对应类型的全类名
@Conditional
条件装配:满足Conditional指定的条件,则进行组件注入
@Conditional 是一个根注解,下面有很多扩展注解
如果扩展注解放在配置类上,表示该类的所有组件都要进行条件约束
@ImportResource
作用:原生配置文件引入, 也就是可以直接导入Spring 传统的 beans.xml ,可以认为是SpringBoot 对Spring 容器文件的兼容
将beans.xml文件导入到配置类中
spring或springboot扫描beans.xml文件需要new ClassPathXmlApplicationContext(“”);
现在导入到配置类中,springboot可以直接SpringApplication.run(MainApp.class, args);
@Configuration
@ImportResource(locations = "classpath:beans.xml")
public class BeanConfig2 {}
配置绑定@ConfigurationProperties
加入configuration-processor依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><!--配置optional为true说明: 表示防止将此依赖传递到其它模块--><optional>true</optional></dependency>
使用Java读取到SpringBoot 核心配置文件 application.properties 的内容, 并且把它封装到JavaBean中
如果不添加@Component注解会报错
第二种方法在配置类上加@EnableConfigurationProperites,通过配置类注入到容器
开启Furn配置绑定功能,把Furn组件自动注册到容器中
在Bean中必须要有set方法,否则属性值是null
如果application.properties有中文,需要转成unicode编码写入
在网站中把中文转码,再粘贴回去
Lombok
写@AllArgsConstructor会覆盖无参构造器,搭配上@NoArgsConstructor
@Slf4j --- 日志输出
yaml
以数据为中心的标记语言
基本语法
数据类型
字面量
单个的、不可再分的值:data、boolean、string、number、null
对象
键值对的集合:map、hash、set、object
数组
一组按次序排列的值:array、list、queue
应用
前缀就是yaml第一级的名称
细节
如果 application.properties 和 application.yml 有 相同的前缀值绑定
application.properties 优先级高, 开发时,应当避免
加入依赖会有提示字段
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><!--配置optional为true说明: 表示防止将此依赖传递到其它模块--><optional>true</optional></dependency>
静态资源访问
可以直接访问x.jpg,直接放在resources下访问会报错
静态资源访问原理原理:http://localhost:8080/1.jpg,静态映射是/**,先看/1.jpg是否会被Controller处理,否则交给静态资源处理,如果静态资源找不到则响应404 页面
静态资源访问前缀和控制器请求路径冲突,需要改变静态资源访问前缀
在application.yml修改
spring:web:resources:static-locations: /res/**
改变默认的静态资源路径,比如希望在类路径下增加 hspimg目录作为静态资源路径
如果你配置static-locations,原来的访问路径就被覆盖了,需要重新指定一下
spring:mvc:static-path-pattern: /res/**web:resources:static-locations: ["classpath:/hspimg/","classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"]
Rest风格请求处理
Rest 风格支持(使用HTTP请求方式动词来表示对资源的操作)
请求方式:/monster
GET-获取怪物
DELETE-删除怪物
PUT-修改怪物
POST-保存妖怪
细节
1、客户端是PostMan 可以直接发送Put、delete等方式请求,可不设置Filter
2、如果要SpringBoot支持页面表单的Rest功能, 则需要注意如下细节
需要在application.yml 启用filter功能,否则无效
Rest风格请求核心Filter ; HiddenHttpMethodFilter ,表单请求会被 HiddenHttpMethodFilter 拦截 , 获取到表单 _method 的值,再判断是PUT/DELETE/PATCH
spring:mvc:hiddenmethod:filter:enabled: true
没有视图解析器,会输出abc,否则就走视图解析器定位的页面
使用@Controller
return "xxx";1、先看Controller有没有对应的[没有配置视图解析器]
2、如果配置视图解析器,就定位页面
1、页面在静态目录下
spring:view:suffix: .htmlprefix: /
2、更改静态资源访问路径,view需要和static-path-pattern保持一致
spring:mvc:static-path-pattern: /res/**view:suffix: .htmlprefix: /res/
接收参数相关注解
@PathVariable、@RequestParam
在形参加上@PathVariable Map<String,String> map,可以把所有参数放进Map中,但是有多个值(List)只会取第一个,因为Map的key是唯一的
<a href="/monster/200/jack">@PathVariable-路径变量 monster/200/jack</a>
=========================================================================
@RequestHeader
获取 Http 请求头
@RequestHeader里的参数名不区分大小写
可以通过Map获取所有Http请求头
@CookieValue
获取Cookie,还可以通过request
1. value = "cookie_key" 表示接收名字为 cookie_key的cookie
2. 如果浏览器携带来对应的cookie , 那么 后面的参数是String ,则接收到的是对应的value
3. 后面的参数是Cookie ,则接收到的是封装好的对应的cookie
@RequestBody
处理Json数据
获取POST请求体
也可以封装到JavaBean对象中
输入hspedu 100,输出
@RequestAttribute、@SessionAttribute
获取域的数据
复杂参数
自定义对象参数-自动封装
会自动封装,要求提交的数据,表单请求参数名和对象的字段名保持一致
自定义转换器
SpringBoot在响应客户端请求时,将提交的数据封装成对象时,使用了内置的转换器(有124个)
实现接口形式
向容器注入Bean形式
Converter 转换器接口
1、新建一个配置类,使用Lite模式
2、注入Bean(返回类型是接口类型WebMvcConfigurer)
2.1.返回这个类型的对象并重写addFormatters方法,并自定义转换器
2.2.使用匿名内部类,实现接口的方法(转换器会注册到converters容器中
换种写法,先创建自定义的转换器
如果添加了多个Converter<String,Car>类型的转换器,Hashmap的key是唯一的
后面的会覆盖前面的
处理Json
SpringBoot支持返回Json格式数据,在启用Web开发场景时,已经引入了相关依赖
会先经过return monster;再经过转换器
底层仍然使用转换器,根据请求带来的Accept类型,发出请求时就已经指定了返回的格式
内容协商
可以手动设置Accept=application/json或application/xml等等(在postman可以设置)
默认按照Json格式返回,springboot 依赖包含了 json 数据格式的
jar
依赖。可以在pox.xml中引入xml依赖,由于xml比json优先级高,会显示xml 格式的数据类型
对于浏览器,我们无法修改Accept的值
需要开启支持基于请求参数的内容协商功能(在application.yaml中设置)
在地址后加上?format=xxx ,xxx 就是要转换显示为xxx格式的数据的值
format可以修改
Thymeleaf
服务器渲染技术,页面数据是在服务端进行渲染的,并不是前后端分离
首先要声明名称空间:xmlns:th="http://www.thymeleaf.org"
引入Thymeleaf依赖,项目会自动完成配置
会直接使用视图解析到thymeleaf下的模板文件
拦截器
使用了Thymeleaf
与转换器写法差不多
1、实现HandlerInterceptor接口
2、拦截器注册到配置类中(实现WebMvcConfigurer的addInterceptors)
3、指定拦截规则
实现接口形式
/images/**是静态资源的图片,也会发出请求,需要放行
向容器注入Bean形式
文件上传
使用了Thymeleaf
设置上传文件大小
第一种
第二种
文件名:随机数+毫秒数+实际文件名
分目录存放:根据当前日期存放
相关文章:

SpringBoot1~~~
目录 快速入门 依赖管理和自动配置 修改自动仲裁/默认版本号 starter场景启动器 自动配置 修改默认扫描包结构 修改默认配置 读取application.properties文件 按需加载原则 容器功能 Configuration Import 编辑 Conditional ImportResource 配置绑定Configur…...

兼容多家品牌手机的多协议取电快充芯片
随着智能手机的普及和功能不断的增强,电池续航能力成为了用户关注的焦点,为了解决这各问题各大手机厂商推出了手机快充技术,快充协议是快充技术的核心,每家品牌手机都有自己的独家快充协议,如FCP/SCP协议是华为手机的独…...
Java和Python的不同
1. 语法差异 Java: - Java是一种强类型语言,要求在编译时明确变量的数据类型。 - Java代码块由大括号 {} 包围,如方法体、循环和条件语句。 - Java使用分号 ; 作为语句的结束符。 public class HelloWorld {public static void main(String[] args) {S…...

Moshang摩熵医药数据库
摩熵医药数据库是摩熵数科信息公司旗下的一个核心产品,专注于为医药行业提供全面的数据支持和决策服务。该医药数据库整合了中、美、欧、日等全球七十多个主流国家的数10万数据信息源,其中收载的50亿数据体系的覆盖了生物医药全生命周期数据和精细化工全…...

基于web的酒店客房管理系统【附源码】
基于web的酒店客房管理系统(源码L文说明文档) 目录 4 系统设计 4.1 系统概述 4.2系统结构 4.3.数据库设计 4.3.1数据库实体 4.3.2数据库设计表 5系统详细实现 5.1 用户信息管理 5.2 会员信息管理 5.3 客房信息管理 5.…...

潜水定位通信系统的功能和使用方法_鼎跃安全
潜水定位通信系统是保障潜水安全与作业高效的关键设备。它利用先进的声呐、无线电等技术,可精准定位潜水员位置。在水下能实现潜水员之间以及与水面的双向通信,确保信息及时传递。具备高可靠性和稳定性,即使在复杂水环境中也能正常运行。 一、…...

Golang | Leetcode Golang题解之第477题汉明距离总和
题目: 题解: func totalHammingDistance(nums []int) (ans int) {n : len(nums)for i : 0; i < 30; i {c : 0for _, val : range nums {c val >> i & 1}ans c * (n - c)}return }...

JavaWeb——Maven(1/8):整体介绍(什么是Maven、Maven的作用、小结)
目录 什么是Maven Maven的作用 依赖管理 统一项目结构 项目构建 小结 Web前端开发的知识了解完毕后,接下来要进入后端Web开发的学习,这一部分的内容是学习的重点。在这一部分内容中,首先要了解 Java 项目的构建工具 Maven。 首先先来介…...

Vivado 跟Xilinx SAE学HLS系列-高亚军(复合数据类型)
文章目录 目录 文章目录 Struct元素优化 枚举 ENUMERATED TYPE 希望能为你提供更多的创造力。 Struct元素优化 在对应的结构体变量--directive里面使用field_level或者struct_level进行优化. 4 4 4 4 4-------8 8 8 8 8 20-24; 查看波形--查看实际的分配情况 枚举 ENUMERATED …...
【mysql】WITH AS 语法详解
【mysql】WITH AS 语法详解 【一】WITH AS语法的基本结构【二】案例1【三】案例2 WITH AS 语法是MySQL中的一种临时结果集,它可以在SELECT、INSERT、UPDATE或DELETE语句中使用。通过使用WITH AS语句,可以将一个查询的结果存储在一个临时表中,…...
Rocky linux SSD安装
1. 下载ISO文件 Index of /vault/rocky/9.3/isos/x86_64/ 下载DVD iso 2.使用RUFUS制作启动盘,注意UEFI选项 Rufus - 轻松创建 USB 启动盘 3. 重启,F2进bios,选择U盘启动安装 4. 选择安装盘 5. 设置用户密码,用户名默认root 其他&#x…...
在 Linux 系统中设置 Service 服务开机自启的详细指南
目录 在 Linux 系统中设置 Service 服务开机自启的详细指南一、Linux 服务管理概述二、systemd 中设置服务开机自启2.1 systemd 介绍2.2 如何检查服务的状态2.3 启用服务开机自启2.4 手动启动和停止服务2.5 检查服务是否成功启用2.6 禁用开机自启服务 三、在 sysvinit 中设置服…...

Flythings学习(四)串口通信
文章目录 1 串口编程基本步骤1.1 打开串口1.2 配置串口 1.3 读串口1.4 发送串口1.5 关闭串口 2 综合使用3 如何在软件上保证串口稳定通信4 flythings中的串口通讯5 协议接收部分使用和修改方法6 通讯协议数据怎么和UI控件对接 1 串口编程基本步骤 串口通信有5个步骤 1.打开串口…...

[数据结构]带头双向循环链表的实现与应用
文章目录 一、引言二、链表的基本概念1、链表是什么2、链表与顺序表的区别3、带头双向循环链表 三、带头双向循环链表的实现1、结构体定义2、初始化3、销毁4、显示5、数据操作 四、分析带头双向循环链表1、存储方式2、优点3、缺点 五、总结1、练习题2、源代码 一、引言 链表作…...

商品详情数据API接口开发系列(属性规格详情图sku等)
商品详情数据API接口开发是一个复杂但至关重要的过程,它涉及多个方面,包括属性规格、详情图、SKU等关键信息的处理。以下是对该开发系列中这些关键要素的详细探讨: 一、商品详情数据API接口概述 商品详情数据API接口是指一种编程接口&#x…...
在 Ubuntu 上安装 clang-format-14
在 Ubuntu 上安装 clang-format-14 可以通过以下步骤完成: 1. 添加 LLVM 的官方 APT 仓库 首先,你需要添加 LLVM 的官方 APT 仓库,以便能够安装最新版本的 clang-format。 # 安装必要的依赖 sudo apt update sudo apt install -y wget gnu…...

【优选算法篇】双指针的华丽探戈:深入C++算法殿堂的优雅追寻
文章目录 C 双指针详解:进阶题解与思维分析前言第一章:有效三角形的个数1.1 有效三角形的个数示例 1:示例 2:解法一(暴力求解)解法二(排序 双指针)易错点提示代码解读 第二章&#…...
【springboot入门-mvc常用注解使用方式及原理】
常用注解 PathVariable:用于从URL路径中提取变量。RequestHeader:用于从HTTP请求头中获取数据。ModelAttribute:用于获取请求参数(包括URL参数和POST请求的表单数据),也可以用于将数据绑定到对象上。Reque…...
滚雪球学Redis[4.2讲]:Redis Sentinel 深度解析:工作原理、配置与高可用架构下的故障转移
全文目录: 🎉前言🚦4.2 Redis Sentinel🔄Sentinel的工作原理Sentinel的选举机制 ⚙️Sentinel的配置与使用示例:配置Redis SentinelSentinel自动故障转移过程示例 🧩高可用架构下的故障转移常见问题与优化实…...
Vue3 -- 设置分页,切换分页之后选项仍能保留 控制多个表格的选中不会互相影响
在 Vue 3 中实现分页功能,并确保在切换分页时选中的选项能够保留,同时控制多个表格之间的选中状态不互相影响,可以按照以下步骤进行: 1. 数据结构设计 为每个表格维护独立的选中项和分页状态。可以使用一个对象来存储每个表格的…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...

MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...