SpringBoot2尚硅谷笔记

SpringBoot2

网课链接 https://www.bilibili.com/video/BV19K4y1L7MT?from=search&seid=18416616320162201024

参考笔记 https://blog.csdn.net/u011863024/article/details/113667634

​ https://blog.csdn.net/u011863024/article/details/113667946

官网 https://spring.io/

代码 https://gitee.com/userwhz/springboot-ssg

SpringBoot2基础入门

Spring

作用

Web开发

数据访问

安全控制

分布式

消息服务

移动开发

批处理



Spring5引入响应式开发

基于Java8新特性,如接口默认实现,源码发生改变

SpringBoot

优点

创建独立Spring应该

内嵌web服务器		

自动starter依赖,简化构建配置

自动配置Spring以及第三方功能

提供生产级别的监控,健康检查及外部化配置

无代码生成,无需编写xml

缺点

版本迭代太快

封装太深,内部原理复杂,不容易精通



SpringBoot整合Spring技术栈的一站式框架

简化Spring技术栈的快速开发脚手架

微服务

架构风格

一个应用拆分为一组小型服务

每个服务都运行在注解的进程内,可以独立部署和升级

服务之间使用轻量级HTTP交互

服务围绕业务功能拆分

可以全自动部署机制独立部署

去中心化,服务自治,服务可以使用不用的语言,不同的存储技术



分布式



云原生

上云的困难

- 服务自愈
- 弹性伸缩
- 服务隔离
- 自动化部署
- 灰度发布
- 流量治理

SpringBoot2入门


SpringBoot官网	https://spring.io/projects/spring-boot#learn



需求:浏览发送/hello请求,响应 “Hello,Spring Boot 2”

创建maven工程

引入依赖

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.3.4.RELEASE</version>
</parent>

<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
</dependencies>



编写主程序类

@SpringBootApplication

标志主程序类



配置文件可以直接设置端口号



测试直接运行main



简化部署	默认打包为jar

引入插件

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
		</plugin>
	</plugins>
</build>

报红需要加上版本号

打包package

运行cmd java -jar jar包名

依赖管理机制

父项目做依赖管理

​		几乎声明了所有开发中常用的依赖的版本号,自动版本仲裁机制

开发导入starter场景启动器

​		spring-boot-starter-* : *代表某种场景

​		只要引入starter,这个场景的所有常规需要的依赖我们都自动引入

​		所有的starter 	https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.build-systems.starters

​		见到的 *-spring-boot-starter: 第三方为我们提供的简化开发的场景启动器。

无需关注版本号,自动版本仲裁

1. 引入依赖默认都可以不写版本
2. 引入非版本仲裁的jar,要写版本号。

可以修改默认版本号

1. 查看spring-boot-dependencies里面规定当前依赖的版本 用的 key。
2. 在当前项目里面重写配置,如下面的代码。





所有场景启动器最底层的依赖		自动配置的核心依赖
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter</artifactId>
	<version>2.3.4.RELEASE</version>
	<scope>compile</scope>
</dependency>


自动配置特性

自动配好Tomcat

​	引入Tomcat依赖

​	配置Tomcat

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-tomcat</artifactId>
	<version>2.3.4.RELEASE</version>
	<scope>compile</scope>
</dependency>

自动配好SpringMVC

​		引入SpringMVC全套组件

​		自动配好SpringMVC常用组件(功能)

自动配好Web常见功能,如:字符编码问题

​		SpringBoot帮我们配置好了所有web开发的常见场景





```
public static void main(String[] args) {
//1、返回我们IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
//2、查看容器里面的组件
String[] names = run.getBeanDefinitionNames();
for (String name : names) {
    System.out.println(name);
	}
}
```



默认的包结构

​		主程序所在包及其下面的所有子包里面的组件都会被默认扫描进来

​		无需以前的包扫描配置

​		想要改变扫描路径

​			@SpringBootApplication(scanBasePackages=“com.atguigu”)

​			或者@ComponentScan 指定扫描路径



@SpringBootApplication

等同于

@SpringBootConfiguration

@EnableAutoConfiguration

@ComponentScan("com.atguigu")

各种配置拥有默认值

​		默认配置最终都是映射到某个类上,如:MultipartProperties

​		配置文件的值最终会绑定每个类上,这个类会在容器中创建对象

按需加载所有自动配置项

​		非常多的starter

​		引入了哪些场景这个场景的自动配置才会开启

​		SpringBoot所有的自动配置功能都在 spring-boot-autoconfigure 包里面

底层注解


@Configuration	

配置类注解	(proxyBeanMethods = true)是不是代理bean的方法 默认true	spring boot总会检测组件是否存在

如果false	则不是单实例

Full(proxyBeanMethods = true)(保证每个@Bean方法被调用多少次返回的组件都是单实例的)(默认) 

Lite(proxyBeanMethods = false)(每个@Bean方法被调用多少次返回的组件都是新创建的)

如果没有组件依赖,那么调成false可以提高效率

@Bean	可以自定义名字	默认方法名	单实例

@Component	

@Controller	

@Service	

@Repository

@ComponentScan	

@Import	@Import({User.class, DBHelper.class})	自动创建出这两个类型的组件、默认组件的名字就是全类名

@Conditional	条件装配	满足Conditional指定的条件,则进行组件注入	不满足则不注入

@ImportResource("classpath:beans.xml")	 迁移xml文件	容器将导入组件

@ConfigurationProperties	配置绑定		(prefix = "mycar")	前缀	加到@Component

配置类加属性绑定	@EnableAutoConfiguration 把组件自动注入到容器	+	@ConfigurationProperties

自动配置(源码分析)

@SpringBootApplication等同于

- @SpringBootConfiguration 	配置类

- @EnableAutoConfiguration	

​		@AutoConfigurationPackage	自动配置包

​			利用Registrar给容器中导入一系列组件

​			将指定的一个包下的所有组件导入进MainApplication所在包下。

​		@Import({AutoConfigurationImportSelector.class})

​		1)利用getAutoConfigurationEntry(annotationMetadata)	给容器中批量导入一些组件

​		2)调用List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes)

​				获取到所有需要导入到容器中的配置类

​		3)利用工厂加载 Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader);得到所有的组件

​		4)从META-INF/spring.factories位置来加载一个文件。

​					默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件

​					spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有META-INF/spring.factories

​		# 文件里面写死了spring-boot一启动就要给容器中加载的所有配置类 

-  @ComponentScan	指定扫描哪些Spring注解。



SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration

每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。(xxxxProperties里面读取,xxxProperties和配置文件进行了绑

定)

生效的配置类就会给容器中装配很多组件

只要容器中有这些组件,相当于这些功能就有了

定制化配置

​	用户直接自己@Bean替换底层的组件

​	用户去看这个组件是获取的配置文件什么值就去修改。

xxxxxAutoConfiguration —> 组件 —> xxxxProperties里面拿值 ----> application.properties


开发步骤


1)引入依赖

2)查看自动配置了哪些	选做

自己分析	配置文件中debug=true开启自动配置报告

3)是否需要修改

参照文档修改配置项

https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#common-application-properties

​	自己分析。xxxxProperties绑定了配置文件的哪些。

自定义加入或者替换组件

​	@Bean、@Component…

自定义器 XXXXXCustomizer;



开发小技巧

Lombok简化开发

引入依赖

安装插件

@Data	生成get和set方法

@ToString

@AllArgsConstructor	全参构造器

@NoArgsConstructor	无参构造器

@EqualsAndHashCode

@Slf4j	log.info("日志信息")





热更新

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

ctrl + f9  	项目重启



Spring Initailizr

static	静态资源

templates	页面

SpringBoot2核心功能

配置文件


properties

yaml/yml标记语言

适合以数据为中心的配置文件



基本语法

- key: value	kv之间有空格
- 区分大小写
- 使用缩进表示层级关系
- 缩进不允许使用tab,只允许空格
- 缩进的空格数不重要,只要相同层级的元素左对齐即可
- '#'表示注释
- 字符串无需加引号,如果要加,单引号’’,双引号""表示字符串内容会被 转义,不转义





Spring Boot Configuration Annotation Processor not configured 问题解决

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>



打包时去除依赖

<exclude>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
</exclude>


web开发

SpringMVC自动配置

大多场景我们都无需自定义配置

- 内容协商视图解析器和BeanName视图解析器
- 静态资源(包括webjars)
- 自动注册 `Converter,GenericConverter,Formatter`

- 支持 `HttpMessageConverters` (后来我们配合内容协商理解原理)

- 自动注册 `MessageCodesResolver` (国际化用)
- 静态index.html 页支持

- 自定义 `Favicon`
- 自动使用 `ConfigurableWebBindingInitializer` ,(DataBinder负责将请求数据绑定到JavaBean上)
静态资源访问
静态资源目录

静态资源放在类路径下: called `/static` or `/public` or `/resources` or `/META-INF/resources`

访问:当前项目根路径/ + 静态资源名

原理: 静态映射/**

请求进来,先去找Controller看能不能处理。不能处理的所有请求又都交给静态资源处理器。静态资源也找不到则响应404页面。



改变默认的静态资源路径,/static,/public,/resources, /META-INF/resources失效

resources:  static-locations: [classpath:/haha/]



spring:  

​	mvc:   

​		 static-path-pattern: /res/**

静态资源访问前缀

当前项目 + static-path-pattern + 静态资源名 = 静态资源文件夹下找





欢迎页支持

静态资源路径下 index.html

- 可以配置静态资源路径
- 但是不可以配置静态资源的访问前缀。否则导致 index.html不能被默认访问

controller能处理/index

请求参数处理

@xxxMapping;

- @GetMapping
- @PostMapping
- @PutMapping
- @DeleteMapping

用法

- 开启页面表单的Rest功能
- 页面 form的属性method=post,隐藏域 _method=put、delete等(如果直接get或post,无需隐藏域)
- 编写请求映射



常用参数注解

@PathVariable 路径变量

@RequestHeader 获取请求头信息

@RequestParam 获取请求参数(指问号后的参数)	

@CookieValue 获取Cookie值

@RequestAttribute 获取request域属性

@RequestBody 获取请求体[POST]

@MatrixVariable 矩阵变量

@ModelAttribute
视图解析与模板引擎

SpringBoot默认不支持JSP,需要引入第三方模板引擎技术实现页面渲染

引入依赖

页面放/templates下面



server:  

​	servlet:    

​		context-path: /app *#设置应用名*

这个设置后,URL要插入`/app`, 如`http://localhost:8080/app/hello.html`



拦截器

登录检查与静态资源放行

编写一个拦截器实现HandlerInterceptor接口

拦截器注册到容器中(实现WebMvcConfigurer的addInterceptors())

指定拦截规则(注意,如果是拦截所有,静态资源也会被拦截)

目标方法执行之前
目标方法执行完成以后
页面渲染以后

拦截器注册到容器中 && 指定拦截规则

@Configuration
public class AdminWebConfig implements WebMvcConfigure
文件上传
文件上传相关的配置类:

org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.MultipartProperties

spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=100MB
错误处理

- 默认情况下,Spring Boot提供`/error`处理所有错误的映射
- 机器客户端,它将生成JSON响应,其中包含错误,HTTP状态和异常消息的详细信息。对于浏览器客户端,响应一个“ whitelabel”错误视图,以HTML格式呈现相同的数据



要对其进行自定义,添加View解析为error

要完全替换默认行为,可以实现 ErrorController并注册该类型的Bean定义,或添加ErrorAttributes类型的组件以使用现有机制但替换其内容。

/templates/error/下的4xx,5xx页面会被自动解析

原生组件注入
@WebServlet

@WebFilter

@WebListener

还要在主启动类添加注解`@ServletComponentScan`





Spring方式注入

ServletRegistrationBean`, `FilterRegistrationBean`, and `ServletListenerRegistrationBean


定制化原理
定制化的常见方式

1)修改配置文件

2)xxxxxCustomizer

3)编写自定义的配置类 xxxConfiguration + @Bean替换、增加容器中默认组件,视图解析器

4)Web应用 编写一个配置类实现 WebMvcConfigurer 即可定制化web功能 + @Bean给容器中再扩展一些组件

5)@EnableWebMvc + WebMvcConfigurer — @Bean 可以全面接管SpringMVC,所有规则全部自己重新配置; 实现定制和扩展功能(高级功能)。

数据访问


数据源的自动配置

导入JDBC依赖

导入了数据源

jdbc

事务

但没有导入驱动(不知道要操作的数据库)

导入mysql驱动

相关数据源配置类	自动配置的类

DataSourceAutoConfiguration : 数据源的自动配置。

修改数据源相关的配置:spring.datasource。

数据库连接池的配置,是自己容器中没有DataSource才自动配置的。

底层配置好的连接池是:HikariDataSource。

DataSourceTransactionManagerAutoConfiguration: 事务管理器的自动配置。

JdbcTemplateAutoConfiguration: JdbcTemplate的自动配置,可以来对数据库进行CRUD。

@Bean @Primary JdbcTemplate:Spring容器中有这个JdbcTemplate组件,使用@Autowired。

JndiDataSourceAutoConfiguration: JNDI的自动配置。

XADataSourceAutoConfiguration: 分布式事务相关的。



Spring Boot整合第三方技术的两种方式:

- 自定义
- 找starter场景







使用Druid数据源

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.17</version>
</dependency>

配置Druid数据源



druid数据源starter整合方式

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.17</version>
</dependency>

配置文件配置





整合Mybatis

引入依赖

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.4</version>
</dependency>

全局配置文件

SqlSessionFactory:自动配置好了

SqlSession:自动配置了SqlSessionTemplate 组合了SqlSession

@Import(AutoConfiguredMapperScannerRegistrar.class)

Mapper: 只要我们写的操作MyBatis的接口标准了@Mapper就会被自动扫描进来



导入MyBatis官方Starter。

编写Mapper接口,需@Mapper注解。

编写SQL映射文件并绑定Mapper接口。

在application.yaml中指定Mapper配置文件的所处位置,以及指定全局配置文件的信息 (建议:配置在mybatis.configuration)。



整合MyBatis-注解配置混合



整合Mybatis Plus

引入依赖

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.1</version>
</dependency>

MybatisPlusAutoConfiguration配置类,MybatisPlusProperties配置项绑定。

SqlSessionFactory自动配置好,底层是容器中默认的数据源。

mapperLocations自动配置好的,有默认值classpath*:/mapper/**/*.xml,这表示任意包的类路径下的所有mapper文件夹下任意路径下的

所有xml都是sql映射文件。 建议以后sql映射文件放在 mapper下。

容器中也自动配置好了SqlSessionTemplate。

@Mapper 标注的接口也会被自动扫描,建议直接 @MapperScan("com.lun.boot.mapper")批量扫描。

MyBatisPlus优点之一:只需要我们的Mapper继承MyBatisPlus的BaseMapper 就可以拥有CRUD能力,减轻开发工作。



整合Redis

RedisAutoConfiguration自动配置类,RedisProperties 属性类 --> spring.redis.xxx是对redis的配置。

连接工厂LettuceConnectionConfiguration、JedisConnectionConfiguration是准备好的。

自动注入了RedisTemplate<Object, Object>,xxxTemplate。

自动注入了StringRedisTemplate,key,value都是String

底层只要我们使用StringRedisTemplate、RedisTemplate就可以操作Redis。


单元测试


JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage

JUnit Platform: Junit Platform是在JVM上启动测试框架的基础,不仅支持Junit自制的测试引擎,其他测试引擎也都可以接入。

JUnit Jupiter: JUnit Jupiter提供了JUnit5的新的编程模型,是JUnit5新特性的核心。内部包含了一个测试引擎,用于在Junit Platform上运

行。

JUnit Vintage: 由于JUint已经发展多年,为了照顾老的项目,JUnit Vintage提供了兼容JUnit4.x,JUnit3.x的测试引擎。



SpringBoot 2.4 以上版本移除了默认对 Vintage 的依赖。如果需要兼容JUnit4需要自行引入(不能使用JUnit4的功能 @Test)

JUnit 5’s Vintage已经从spring-boot-starter-test从移除。如果需要继续兼容Junit4需要自行引入Vintage依赖:





引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

@SpringBootTest 





常用测试注解

@Test:表示方法是测试方法。但是与JUnit4的@Test不同,他的职责非常单一不能声明任何属性,拓展的测试将会由Jupiter提供额外测

试

@ParameterizedTest:表示方法是参数化测试。

@RepeatedTest:表示方法可重复执行。

@DisplayName:为测试类或者测试方法设置展示名称。

@BeforeEach:表示在每个单元测试之前执行。

@AfterEach:表示在每个单元测试之后执行。

@BeforeAll:表示在所有单元测试之前执行。

@AfterAll:表示在所有单元测试之后执行。

@Tag:表示单元测试类别,类似于JUnit4中的@Categories。

@Disabled:表示测试类或测试方法不执行,类似于JUnit4中的@Ignore。

@Timeout:表示测试方法运行如果超过了指定时间将会返回错误。

@ExtendWith:为测试类或测试方法提供扩展类引用。



断言机制

这些断言方法都是org.junit.jupiter.api.Assertions的静态方法。检查业务逻辑返回的数据是否合理。所有的测试运行结束以后,会有一个

详细的测试报告。

简单断言

方法	说明

assertEquals	判断两个对象或两个原始类型是否相等

assertNotEquals	判断两个对象或两个原始类型是否不相等

assertSame	判断两个对象引用是否指向同一个对象

assertNotSame	判断两个对象引用是否指向不同的对象

assertTrue	判断给定的布尔值是否为 true

assertFalse	判断给定的布尔值是否为 false

assertNull	判断给定的对象引用是否为 null

assertNotNull	判断给定的对象引用是否不为 null

数组断言

通过 assertArrayEquals 方法来判断两个对象或原始类型的数组是否相等。

组合断言

`assertAll()`方法接受多个 `org.junit.jupiter.api.Executable` 函数式接口的实例作为要验证的断言,可以通过 lambda 表达式很容易的提供这些断言。

异常断言

在JUnit4时期,想要测试方法的异常情况时,需要用`@Rule`注解的`ExpectedException`变量还是比较麻烦的。而JUnit5提供了一种新的断

言方式`Assertions.assertThrows()`,配合函数式编程就可以进行使用。

超时断言

JUnit5还提供了Assertions.assertTimeout()为测试方法设置了超时时间。

快速失败

通过 fail 方法直接使得测试失败。





前置条件

Unit 5 中的前置条件(assumptions【假设】)类似于断言,不同之处在于不满足的断言assertions会使得测试方法失败,而不满足的前

置条件只会使得测试方法的执行终止。

前置条件可以看成是测试方法执行的前提,当该前提不满足时,就没有继续执行的必要。







嵌套测试

JUnit 5 可以通过 Java 中的内部类和`@Nested` 注解实现嵌套测试,从而可以更好的把相关的测试方法组织在一起。在内部类中可以使用

`@BeforeEach` 和`@AfterEach`注解,而且嵌套的层次没有限制。



参数化测试

参数化测试是JUnit5很重要的一个新特性,它使得用不同的参数多次运行测试成为了可能,也为我们的单元测试带来许多便利。

利用@ValueSource等注解,指定入参,我们将可以使用不同的参数进行多次单元测试,而不需要每新增一个参数就新增一个单元测试,

省去了很多冗余代码。

利用**@ValueSource**等注解,指定入参,我们将可以使用不同的参数进行多次单元测试,而不需要每新增一个参数就新增一个单元测试,

省去了很多冗余代码。

@ValueSource: 为参数化测试指定入参来源,支持八大基础类以及String类型,Class类型

@NullSource: 表示为参数化测试提供一个null的入参

@EnumSource: 表示为参数化测试提供一个枚举入参

@CsvFileSource:表示读取指定CSV文件内容作为参数化测试入参

@MethodSource:表示读取指定方法的返回值作为参数化测试入参(注意方法返回需要是一个流)

当然如果参数化测试仅仅只能做到指定普通的入参还达不到让我觉得惊艳的地步。让我真正感到他的强大之处的地方在于他可以支持外部

的各类入参。如:CSV,YML,JSON 文件甚至方法的返回值也可以作为入参。只需要去实现**ArgumentsProvider**接口,任何外部文件都可以

作为它的入参。

高级特性

Profile环境切换

为了方便多环境适配,Spring Boot简化了profile功能。

 





配置加载优先级

外部配置源

Java属性文件。

YAML文件。

环境变量。

命令行参数。

配置文件查找位置

classpath 根路径。

classpath 根路径下config目录。

jar包当前目录。

jar包当前目录的config目录。

/config子目录的直接子目录。

配置文件加载顺序:

当前jar包内部的application.properties和application.yml。

当前jar包内部的application-{profile}.properties 和 application-{profile}.yml。

引用的外部jar包的application.properties和application.yml。

引用的外部jar包的application-{profile}.properties和application-{profile}.yml。

指定环境优先,外部优先,后面的可以覆盖前面的同名配置项。


自定义starter

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值