spring-boot

学视频:

https://www.bilibili.com/video/BV15b4y1a7yG/?spm_id_from=333.337.search-card.all.click&vd_source=92411e1ecf865f3abee8328e2eb907a5

springBoot框架

这个框架是基于spring4.0框架设计的,用来简化为spring程序的开发设计

最大的特点就是简化了配置,很多框架配置文件很冗余,难以阅读

springboot集合了大量的框架,使得这些框架都处于版本匹配的版本,然后我我们就不需要自己去导入第三方框架,框架的版本冲突问题就得到了解决

可以创建独立的spring应用程序

内嵌了服务器或者容器,例如tomcat,jetty,undertow啊,应用了springboot的程序就可以直接点击主方法运行,更加方便,不去把代码放在服务器下运行

提供了一个项目对象,就像maven的pom.xml文件一样用来管理项目的目录结构, 关键是这个是一个对象,而不是xml,简化了项目管理,这个对象叫做starter,实际上是依赖于maven的pom.xml文件的,所以一定要是maven工程才能够使用这个starter

尽可能的自动配置spring容器和第三方库,这个就是减少配置的功能

springboot完全没有xml配置也不需要代码生成,就是通过对象操作

我的理解:
springboot不是一个新的技术,而是将多种不同的技术粘合起来的工具

这个工具帮助我们更好,更方便的使用别的框架

主要从三方面做努力:

  1. 配置的简化 使用对象starter,不再使用xml进行配置
  2. 环境或者叫做程序的上下文简化 自己内嵌提供外部环境,使得内部不需要关心,关注开发
  3. 自带第三方 提供稳定的第三方库版本和依赖,解决了自己导入第三方库可能出现的问题

官网:https://spring.io/

springboot学习基础

spring框架要学过

spring mvc

mybatis框架

redis数据库

springboot框架应用要求

jdk要求,不同的spring-boot版本所需要不同

tomcat等等服务器版本的要求

maven版本的要求

servlet版本的要求

搭建springboot环境

使用Maven项目创建spring boot工程

实际上创建springboot项目并不是一定需要maven工程,使用gradle创建工程也是可以的但是需要做一些改变

导入springboot依赖和配置

springboot的导入不是通过dependency标签添加依赖的,记得之前说了springboot要解决第三方框架的版本冲突和不稳定的问题,所以springboot采取的是自己先配置好了pom.xml文件,而我们的配置文件只需要继承这个配置文件,那么就相当于springboot的配置

所以使用<parent>标签,导入springboot的配置

虽然springboot可以自己给自己默认添加一些依赖,但是有一些依赖在绝大多数情况下是不需要的,所以当我们需要的时候,还是得手动添加依赖

1
2
3
4
5
<parent>
<groupId></groupId>
<articleId>spring-boot-starter-parent</articleId>
</parent>
some other need dependencies...

新手第一步 快速搭建

思想

spring boot是用来简化spring应用开发的初始搭建和开发过程

也就是spring boot是一个加速开发的工具

在idea上创建spring boot项目的步骤

简单描述简单的,打开idea创建一个空project,然后打开项目结构,创建模块

image-20240319112221330

注意选择springboot的jdk版本和开发的jdk版本相同,打包也使用jar包,这样更加通用

springboot在创建的时候需要联网,所以必须要联网才能使用springboot

image-20240319112751843

接下面需要选择springboot的版本,然后选择开发模版,如果我们想开发web应用就选择web

现在就创建完毕了,目录就像下面这个样子

image-20240319113219768

简单编写

到包下面创建controller

编辑一个controller即可

image-20240319114239097

直接启动程序,根据控制台的信息,我们可以看到tomcat已经启动

image-20240319114328022

访问这个网址localhost:8080/books可以看到已经成功

结论

不需要配置文件,不需要配置服务器,不需要添加依赖

原理简单阐述

spring boot所需要的依赖信息一个在pom.xml文件中,一个在spring boot创建的Application中

pom.xml在选择创建spring boot版本的时候就会自动创建pom.xml并编写一些东西进去

  1. 添加父工程

image-20240319114818745

在pom.xml中的这一行决定了我们的项目会从这个父工程中获取所需要的一些依赖和配置,这样快速配置的事情就来靠父工程搞定了

  1. 项目依赖

我们开发的是web项目,那么我们就需要单独引入web项目的依赖,这样可以做到父项目依赖简洁不冗余

image-20240319115121540

解决方案: 不需要IDEA的创建方式

idea创建spring boot需要联网,实际上我们如果没有网络想要创建也是可以的

进入spring.io,点击project中的spring boot选项

image-20240319121953421

往下翻,可以找到spring Initializr也就是spring的创建工具,idea实际上也就是调用的这个来创建的spring boot(所以这就是为什么idea创建spring boot需要联网,实际上就是调用的这个网站)

image-20240319122020231

进入就可以看到,和idea一样的界面

image-20240319122222950

想要添加依赖,例如spring web点击这个add dependencies

image-20240319122323431

然后点击generate生成即可,会下载一个压缩包

打开一看就和我们在idea中创建的一样

image-20240319122506923

解决方案: 不需要访问外国网站的创建方式

因为spring的官网是一个外国网站,有些时候可能会出现访问失败,这个时候我们可以使用国内的网站进行创建

先进入idea,创建spring initializr的时候可以发现这里选择的是默认也就是spring的官网的spring initializr进行创建

image-20240319122957841

我们可以选择阿里云提供的spring initializr,因为阿里云是大企业,所以访问外国网站是有专门的信道的,我们就可以通过阿里云进而使用这个spring initializr

image-20240319123241853

就是这个网站https://start.aliyun.com

这个网站非常快!!!

解决方案: 完全没有网络如何创建?

仅限于我们的创建过程没有网络,依赖这些东西如果本地没有就需要网络

我们可以手动的创建pom文件,按照spring-boot需要的配置

parent标签添加spring-boot

denpendencies标签,添加spring-web

然后创建一个springboot的启动类

加上注解@SpringBootApplication

另外再main方法里面SpringAppllication.run(主类.class)

IDEA技巧: 忽略一些文件或者目录不显示

在创建的spring boot文件中会带有一些git,mvn等程序员不需要看到的文件(如果用到也不用开看查看的)

使用idea的功能隐藏这些文件可以使得项目的目录结构更加清晰

image-20240319124501251

有一个file types 的ignored Files添加文件的后缀名可以忽略显示

解析入门程序,spring boot的工作

pom.xml中的parent标签

使得项目可以重用spring boot配置好的一些依赖,这些依赖的版本经过调试,都可以完美的融合在一起

我们只需要选择spring boot配置好的各种版本的依赖组合就行了

spring boot定义了一系列的依赖的版本我们在导入的时候不需要自己设置版本,忽略就会使用父项目中定义的依赖管理

阿里云中创建的spring boot项目就没有使用parent标签,而是直接添加了dependencyManagement导入spring boot的依赖管理,实际效果是一样的

总结

也就是说实际上pom.xml最重要的功能,依赖管理是靠parent标签中的那个项目中的spring.dependency依赖实现的,这个以来里面定义了很多的依赖版本,然后定义了依赖管理,只要的项目pom.xml中导入依赖在spring.dependency重定义过的那么就会直接启用

我们没有导入,那么就不会启用

作用

为我们解决了版本冲突的问题

starter是什么?

starter是一种代表

依赖的项目名称中如果是starter什么什么的话,那么就意味着这个项目中依赖了关于什么什么所需要的所有依赖

例如

spring-boot-starter-web

所以我们可以使用starter快速添加依赖,减少配置

作用

为我们解决了依赖配置多的问题

引导类

就是那么springboot自带的那个application类

实际上,SpringApplication.run(…)就是得到了一个spring容器,spring容器的相关配置都在引导类的注解信息里@SpringBootApplication

这个run方法实际上有两个参数

  1. springbootApplication类的class对象(这个类也就是有@SpringBootApplcation注解的类,用于从注解中读取spring所需要的配置信息)
  2. 主方法传入的args参数

内嵌服务器

在pom,xml中可以看到,在spring-boot-starter-web依赖中有一个spring-boot-starter-tomcat这个依赖

通过这一个依赖,相当于就是写了一个tomcat服务器程序,然后将我们写的程序放在这个内嵌的tomcat中

我们可以通过exlusion标签排除tomcat的内嵌依赖

1
2
3
4
5
6
7
8
9
<dependency>
...
<exclusions>
<exclusion>
<group> 需要排出的依赖所在的组</group>
<artifactId>需要排除的依赖的工件名</artifactId>
</exclusion>
</exclusions>
</dependency>

可以自己导入spring-boot提供的其他服务器的依赖,有三款服务器支持(tomcat,jetty,undertow)

image-20240324154458895

例如

1
2
3
4
<dependency>
<group>org.springframework.boot</group>
<artifactId>spring-boot-stater-jetty</artifactId>
</dependency>

修改配置信息

我们知道,实际上使用spring以及整合很多框架的时候是需要添加很多配置的,现在spring boot提供了默认的配置使得我们启动非常方便

但是我们也有需要修改配置的时候

idea创建工程模板技巧

我们将src和pom.xml文件保留,其他的都删除

修改pom.xml中的artifactid避免作为新工程创建的时候与旧工程发生冲突

删除pom.xml中的name和description标签,这样可以在maven插件中将actifactid作为工程名进行显示

配置属性-properties方式

记得在创建spring boot项目的时候,在resources目录下有一个application.properties文件吗?

这个文件就是spring boot的默认配置文件,spring 会扫描这个文件中的信息

配置服务器端口

直接server.port=端口号

发现我们在输入的时候会有提示!!!

我们在进行启动即可发现,服务端口成功修改!

如果出现端口占用的情况无法启动

在windows上通过netstat -ano | findstr “端口号” 可以查看端口被那个进程占用了

相关解决方法: https://www.cnblogs.com/firstdream/p/8057646.html

netsh http show servicestate 查看一下当前的http服务状态

然后查看请求队列中,是哪些服务

image-20240324200415962

查看控制器进程(通过任务管理器查看更直观)

关闭相应进程即可

配置规则

spring boot中的配置实在是太多了,我们没必要全部记住也记不住

我们需要在spring官方网站上,进入projects里的spring boot选项

进入Learn选项

documentation中的current文档Reference Doc

最下面的Application Properties就是配置说明

自己查

注意

application.properties中的配置和项目中添加的依赖有关

如果你没有添加相关依赖,那么编写配置文件也不会有相关的提示

你写的配置也不会有任何实际的作用

配置属性-yml方式(主流格式)

这种文件配置方式有一个好处就是可以重用一部分前缀

一看便知

image-20240324202132216

按照缩进来划分配置块

还有一种yaml格式

这个格式兼容了yml格式,但是不是很常用

在三种配置文件同时有效的的情况下,不会报错,而是按照优先级解决配置冲突项,优先级properties>yml>yaml

yml格式介绍

yml是yaml是一种数据序列化格式,与xml相比数据大于格式,以数据为中心,而不是格式为中心

容易阅读,容易交互

语法规则

  • 大小写敏感(正常)
  • 属性的层级关系使用多行,加上缩进描述,每行结尾都要使用冒号结束
  • 使用缩进表示层级,同级之间左侧对齐,只允许使用空格**(不允许Tab符号)对齐**
  • 属性值前面加上空格
  • #表示注释
对象怎么写

例如

1
2
3
4
user:
name: 张三
age: 20
# 这就是一个对象
数组怎么写
1
2
3
4
5
6
7
fruits:
- apple
- banana
- orange
# 也就是减号空格 - 元素
#或者
fruit: [apple,banana,orange]
对象数组怎么写
1
2
3
4
5
6
7
8
9
group:
-
name: 张三
age: 18
-
name: 李四
age: 20
#或者
group: [{name:张三,age:18},{name:李四,age:19}]

字面值

image-20240324210343815

引用配置数据

通过${属性名}的方式引用上面配置过的数据

1
2
basedir: c:\windows
tempdir: ${basedir}\temp

一些坑

直接书写字符串,那么特殊字符不会进行解析,直接显示为字符串,相当于是python中的t’字符串’一样

如果想要理解特殊字符,需要表示为字符串””

例如\t想要解析为制表符

1
2
3
4
basedir: c:\windows\temp
# 这个读取出来就是\temp
tempdir: "${basedir}\temp"
# 这个读取出来会变成 c:\widnows\temp emp

从spring读取yml文件中的属性

spring读取yml文件中的配置之后,会读取到一个Environment对象中,实际上这个对象也是一个容器

方式1 通过@Value进行注入获取

我们可以通过@Value(${属性名})来向我们的变量注入值

image-20240324210843182

具体的格式就像上边

方式2 通过Environment类对象得到

上面的第一种方式有一个痛点,就是必须创建一个成员变量进行注入,如果我们有很多的属性需要读取,那么不是需要很多的成员变量吗?

所以spring提供了一个类型Environment类代表整个配置文件对象

我们可以通过访问这个对象,来直接获取值

1
2
3
4
5
6
//首先获取这个对象
@AutoWired
private Environment env;

//获取值
env.getproperty("users[0].name");
方式3 获取一部分配置

方式二有一个痛点就是我们不需要获取全部的配置信息,往往只需要一部分的配置信息即可

比如想要获取配置文件中的一个对象

我们可以自定义一个类型,用于封装我们需要的配置信息

1
2
3
4
5
6
7
8
9
10
11
12
13
//第一步,定义pojo
class MyConfiguration{
private String username;
private String password;

getter...
setter...

}
//第二步,配置成bean
加上@Component注解,使得spring进行管理
//第三步,让spring 进行注入
加上@ConfigurationProperties(profix = "配置前缀")

整合第三方技术

整合原理

实际上就是两点

  1. 各类整合的框架,使用spring管理
  2. 各类框架的配置文件,通过spring接手

将框架交由spring管理

一个问题就是,我们想要spring帮助我们配置,和使用第三方框架的一些类,但是我们无法为这些类添加注解,或者一个一个的为每个类配置bean到xml文件中

所以这个问题实际上是 一个标准spring 和众多标准 的适应,

spring无法做到适应每个框架,但是可以由第三方框架自己提供和spring的适应版本

因为spring实际上已经非常通用,所以第三框架提供一个使用spring进行管理的版本非常容易

但是spring boot为了规范统一标准,也做了一些规定,例如 使用spring boot的第三方整合框架项目的命名必须是 xxxxxxx-starter

如何接手配置文件?

之前的每个第三方框架都有一个自己的配置文件,而spring boot要统一对配置进行管理

如何实现呢?

在各个starter中实现了springboot所需要的配置类,这些配置类这规定了本框架所需要的配置

spring boot在加载了这些框架之后可以读取到

在配置application.yml的时候就去可以通过注解查看这些配置

注意spring boot遵循的是约定优先的原则,所以配置项都是有默认值的

spring整合第三方技术,需要学习的是思想和方法,而不是某一个具体的步骤

整合JUnit

springboot测试的步骤

maven工程在生命周期中的测试是不能跳过的,没有测试无法预测功能的正确性,在执行我们的程序的时候都会先执行测试,测试通过才会执行源程序

springboot在测试的步骤主要分为几部

  1. 先注入要测试的对象
  2. 测试对象中的方法

注意我们的测试类是@SpringBootTest注解的类,这样才能被框架检测到

SpringBoot整合理解

主要步骤就是在test包中的@SpringBootTest注解

前提是在依赖中导入spring-boot-starter-test依赖

1
2
3
4
5
6
7
8
@SpringBootTest
class test{

@Test
void someMethod(){
System.out.println("this is some test information");
}
}

需要注意的是,实际上spring整合配置类,这里的测试类需要用到spring容器

所以需要知道spring容器的位置(也就是spring的配置类)

默认情况下是用当前测试类的包路径下寻找是否有类带@SpringBootConfiguration注解

@SpringBootApplication中集成了@SpringConfiguration注解,这个注解指明了spring容器配置类是哪一个

因为要注解第一步要spring容器注入

所以如果我们的测试类不在这个 默认配置的包下

1
2
3
4
可以使用
@SpringBootTest(classes=...)
也可以使用
@ContextConfiguration("...")

反正就是指明我们的spring容器的配置类在哪里就行了

SpringBoot各种常用操作

1 不同环境的配置文件

很多情况下,不同的环境下,项目需要不同的配置文件。最古老的方案就是修改后再次编译打包。第二中方案就是mvn的pom.xml中配置多个环境,然后打包的时候修改。

最推荐的方式就是springboot的方案,直接将多种环境配置文件一起打包进去,然后根据java运行时给的运行参数来让springboot选择使用哪一个配置文件。

在配置文件中,可以指定默认(不指定运行环境选择)环境选择:

1
2
3
spring:
profiles:
active: dev

这样直接java -jar xxx.jar 直接运行就是 使用的 dev配置文件.

创建多环境配置文件,文件名的格式为:application-{profile}.yml,其中,{profile} 替换为环境名字

在启动时制定启动项: java -jar xxx.jar –spring.profiles.active=dev

2 同源策略,跨域访问

同源策略指的是,浏览器对来自一个源(网站)的脚本,资源等自动发起访问请求的限制。要求只能访问同源也就是自己原来网站的资源,不能访问不同源的资源。这是为了防止这些脚本以浏览器的名义去获取其他源中的用户私密信息。

解决方案:

也就是说浏览器默认发起请求的脚本代码是坏蛋。

我们可以在需要被访问的源中设置这个返回请求头中设置字段cors同源策略为所有源都可以访问。这意味着这个源,不认为自己源中的数据是私密数据。

@CrossOrigin注解,或者拦截器或者手动添加

https://juejin.cn/post/7194734127390654520

3 添加拦截器

我们自定义的拦截器,需要实现拦截器接口HandlerInterceptor

例如:

public class ApiInterceptor implements HandlerInterceptor {

然后在SpringMVC的拦截器链中添加进入自己的拦截器。

通过配置类,来

1
2
3
4
5
6
7
8
9
10
@SpringBootConfiguration
public class WebConfig extends WebMvcConfigurationSupport{

@Override
protected void addInterceptors(InterceptorRegistry registry) {
super.addInterceptors(registry);
//关键代码
registry.addInterceptor(new ApiInterceptor());
}
}

@SpringBootApplication注解的作用

是下面三个注解的集合:

  1. ​ @SpringBootConfiguration 表示这是一个注解类,和@Configuration功能一致。实际上配置类注解是@Component注解的变体。springboot会创建该类的实例。
  2. ​ @EnableAutoConfiguration
  3. ​ @ComponontScan

spring-boot
https://wainyz.online/wainyz/2024/01/20/spring-boot/
作者
wainyz
发布于
2024年1月20日
许可协议