尚硅谷版

https://www.yuque.com/atguigu/springboot

SpringBoot-基础入门-三更草堂

1. SpringBoot简介

1.1 为什么要学习SpringBoot

  1. 我们之前的SSM还是使用起来不够爽。
  • 还需要写很多的配置才能进行正常的使用。
  • 实现一个功能需要引入很多的依赖,尤其是要自己去维护依赖的版本,特别容易出现依赖冲突等问题。

    SpringBoot就能很好的解决上述问题。

1.2 SpringBoot是什么

  1. Spring Boot是基于Spring开发的全新框架,相当于对Spring做了又一层封装。
  2. 其设计目的是用来简化Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。(自动配置)
  3. 并且对第三方依赖的添加也进行了封装简化。(起步依赖)
  4. 所以Spring能做的他都能做,并且简化了配置。
  5. 并且还提供了一些Spring所没有的比如:
  • 内嵌web容器,不再需要部署到web容器中
    提供准备好的特性,如指标、健康检查和外部化配置

    最大特点:自动配置起步依赖

    官网:https://spring.io/projects/spring-boot

2. 快速入门

2.1 基本环境要求

  1. JDK : 8
  2. Maven 3.5.x

Maven配置

  1. <mirrors>
  2. <mirror>
  3. <id>aliyunmaven</id>
  4. <mirrorOf>central</mirrorOf>
  5. <name>aliyun maven</name>
  6. <url>https://maven.aliyun.com/repository/public </url>
  7. </mirror>
  8. </mirrors>
  1. <profiles>
  2. <profile>
  3. <id>jdk-1.8</id>
  4. <activation>
  5. <activeByDefault>true</activeByDefault>
  6. <jdk>1.8</jdk>
  7. </activation>
  8. <properties>
  9. <maven.compiler.source>1.8</maven.compiler.source>
  10. <maven.compiler.target>1.8</maven.compiler.target>
  11. <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
  12. </properties>
  13. </profile>
  14. </profiles>

清理Maven仓库脚本

  1. @echo off
  2. rem create by NettQun
  3. rem 这里写你的仓库路径
  4. set REPOSITORY_PATH=E:\Develop\maven_rep
  5. rem 正在搜索...
  6. for /f "delims=" %%i in ('dir /b /s "%REPOSITORY_PATH%\*lastUpdated*"') do (
  7. echo %%i
  8. del /s /q "%%i"
  9. )
  10. rem 搜索完毕
  11. pause

创建一个bat文件,然后复制上述脚本进去,修改其中maven本地仓库的地址,保存后双击执行即可。

2.2 HelloWorld

①继承父工程

在pom.xml中添加一下配置,继承spring-boot-starter-parent这个父工程

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.5.0</version>
  5. </parent>

②添加依赖

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. </dependency>
  6. </dependencies>

③创建启动类

创建一个类在其实加上@SpringBootApplication注解标识为启动类。

  1. @SpringBootApplication
  2. public class HelloApplication {
  3. public static void main(String[] args) {
  4. SpringApplication.run(HelloApplication.class, args);
  5. }
  6. }

④定义Controller

创建Controller,主要Controller要放在启动类所在包或者其子包下。

  1. @RestController
  2. public class HelloController {
  3. @RequestMapping("/hello")
  4. public String hello(){
  5. return "hello";
  6. }
  7. }

⑤运行测试

直接运行启动类的main方法即可。

2.3 常见问题及解决方案

①访问时404

检查Controller是不是在启动类所在的包或者其子包下,如果不是需要进行修改。

②依赖爆红

配置阿里云镜像后刷新maven项目让其下载。

2.4 打包运行

  1. 我们可以把springboot的项目打成jar包直接去运行。

①添加maven插件

  1. <build>
  2. <plugins>
  3. <!--springboot打包插件-->
  4. <plugin>
  5. <groupId>org.springframework.boot</groupId>
  6. <artifactId>spring-boot-maven-plugin</artifactId>
  7. </plugin>
  8. </plugins>
  9. </build>

②maven打包
SpringBoot项目打包.png
③运行jar包

在jar包所在目录执行命令

  1. java -jar jar包名称

即可运行。

2.5 快速构建

  1. [https://start.spring.io/](https://start.spring.io/)

3.起步依赖

  1. SpringBoot依靠父项目中的版本锁定和starter机制让我们能更轻松的实现对依赖的管理。

3.0 依赖冲突及其解决方案

3.0.1 依赖冲突

  1. 一般程序在运行时发生类似于 java.lang.ClassNotFoundExceptionMethod not found: '……',或者莫名其妙的异常信息,这种情况一般很大可能就是 jar包依赖冲突的问题引起的了。
  2. 一般在是A依赖C(低版本),B也依赖C(高版本)。 都是他们依赖的又是不同版本的C的时候会出现。

3.0.2 解决方案

  1. 如果出现了类似于 java.lang.ClassNotFoundExceptionMethod not found: 这些异常检查相关的依赖冲突问题,排除掉低版本的依赖,留下高版本的依赖。

3.1 版本锁定

  1. 我们的SpringBoot模块都需要继承一个父工程:**spring-boot-starter-parent**。在spring-boot-starter-parent的父工程**spring-boot-dependencies**中对常用的依赖进行了版本锁定。这样我们在添加依赖时,很多时候都不需要添加依赖的版本号了。
  2. 我们也可以采用覆盖properties配置或者直接指定版本号的方式修改依赖的版本。

例如:

直接指定版本号

  1. <dependency>
  2. <groupId>org.aspectj</groupId>
  3. <artifactId>aspectjweaver</artifactId>
  4. <version>1.7.2</version>
  5. </dependency>

覆盖properties配置

  1. <properties>
  2. <aspectj.version>1.7.2</aspectj.version>
  3. </properties>

3.2 starter机制

  1. 当我们需要使用某种功能时只需要引入对应的starter即可。一个starter针对一种特定的场景,其内部引入了该场景所需的依赖。这样我们就不需要单独引入多个依赖了。
  2. 命名规律
  • 官方starter都是以 spring-boot-starter开头后面跟上场景名称。例如:spring-boot-starter-data-jpa
  • 非官方starter则是以 场景名-spring-boot-starter的格式,例如:mybatis-spring-boot-starter

4.自动配置

  1. SpringBoot中最重要的特性就是自动配置。
  2. Springboot遵循“**约定优于配置**”的原则,自动进行了默认配置。这样我们就不需要做大量的配置。
  3. 当我们需要使用什么场景时,就会自动配置这个场景相关的配置。
  4. 如果他的默认配置不符合我们的需求时修改这部分配置即可。

5.YML配置

5.1.简介

5.1.1YML是什么

  1. YAML (YAML Ain't a Markup Language)YAML不是一种标记语言,通常以.yml为后缀的文件,是一种直观的能够被电脑识别的数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入,一种专门用来写配置文件的语言。
  2. YAML试图用一种比XML更敏捷的方式,来完成XML所完成的任务。
  3. 例如:
  1. student:
  2. name: sangeng
  3. age: 15
  1. <student>
  2. <name>sangeng</name>
  3. <age>15</age>
  4. </student>

5.1.2YML优点

  1. YAML易于人们阅读。
  2. 更加简洁明了

5.2.语法

5.2.1约定

  • k: v 表示键值对关系,冒号后面必须有一个空格
  • 使用空格的缩进表示层级关系,空格数目不重要,只要是左对齐的一列数据,都是同一个层级的
  • 大小写敏感
  • 缩进时不允许使用Tab键,只允许使用空格
  • java中对于驼峰命名法,可用原名或使用-代替驼峰,如java中的lastName属性,在yml中使用lastName或 last-name都可正确映射。
  • yml中注释前面要加#

5.2.2键值关系

普通值(字面量)

k: v:字面量直接写;

字符串默认不用加上单引号或者双绰号;

“”: 双引号;转意字符能够起作用

  1. name: "sangeng \n caotang":输出;sangeng 换行 caotang

‘’:单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据

  1. name1: sangeng
  2. name2: 'sangeng \n caotang'
  3. name3: "sangeng \n caotang"
  4. age: 15
  5. flag: true

日期
  1. date: 2019/01/01

对象(属性和值)、Map(键值对)

多行写法:

在下一行来写对象的属性和值的关系,注意缩进

  1. student:
  2. name: zhangsan
  3. age: 20

行内写法:

  1. student: {name: zhangsan,age: 20}

数组、list、set

用- 值表示数组中的一个元素

多行写法:

  1. pets:
  2. - dog
  3. - pig
  4. - cat

行内写法:

  1. pets: [dog,pig,cat]

对象数组、对象list、对象set
  1. students:
  2. - name: zhangsan
  3. age: 22
  4. - name: lisi
  5. age: 20
  6. - {name: wangwu,age: 18}

5.2.3 占位符赋值

可以使用 ${key:defaultValue} 的方式来赋值,若key不存在,则会使用defaultValue来赋值。

例如

  1. server:
  2. port: ${myPort:88}
  3. myPort: 80

5.3.SpringBoot读取YML

5.3.1 @Value注解

  1. 注意使用此注解只能获取简单类型的值(8种基本数据类型及其包装类,String,Date
  1. student:
  2. lastName: sangeng
  1. @RestController
  2. public class TestController {
  3. @Value("${student.lastName}")
  4. private String lastName;
  5. @RequestMapping("/test")
  6. public String test(){
  7. System.out.println(lastName);
  8. return "hi";
  9. }
  10. }

注意:加了@Value的类必须是交由Spring容器管理的

5.3.2 @ConfigurationProperties

  1. yml配置
  1. student:
  2. lastName: sangeng
  3. age: 17
  4. student2:
  5. lastName: sangeng2
  6. age: 15
  1. 在类上添加注解[@Component ](/Component ) 和[@ConfigurationProperties(prefix ](/ConfigurationProperties(prefix ) = "配置前缀")
  1. @Data
  2. @AllArgsConstructor
  3. @NoArgsConstructor
  4. @Component
  5. @ConfigurationProperties(prefix = "student")
  6. public class Student {
  7. private String lastName;
  8. private Integer age;
  9. }
  1. spring容器中获取Student对象
  1. @RestController
  2. public class TestController {
  3. @Autowired
  4. private Student student;
  5. @RequestMapping("/test")
  6. public String test(){
  7. System.out.println(student);
  8. return "hi";
  9. }
  10. }
  1. **注意事项:要求对应的属性要有set/get方法,并且key要和成员变量名一致才可以对应的上。**

lombok讲解视频:

https://www.bilibili.com/video/BV1G54y1V7VG?p=12

https://www.bilibili.com/video/BV1G54y1V7VG?p=13

5.4.练习

要求把下面实体类中的各个属性在yml文件中进行赋值。然后想办法读取yml配置的属性值,进行输出测试。

  1. @Data
  2. @AllArgsConstructor
  3. @NoArgsConstructor
  4. public class Student {
  5. private String lastName;
  6. private Integer age;
  7. private Boolean boss;
  8. private Date birthday;
  9. private Map<String,String> maps;
  10. private Map<String,String> maps2;
  11. private List<Dog> list;
  12. private Dog dog;
  13. private String[] arr;
  14. private String[] arr2;
  15. private Map<String,Dog> dogMap;
  16. }
  17. @Data
  18. @AllArgsConstructor
  19. @NoArgsConstructor
  20. class Dog {
  21. private String name;
  22. private Integer age;
  23. }

答案

  1. # 练习
  2. student:
  3. lastName: sangeng
  4. age: 15
  5. boss: true
  6. birthday: 2006/2/3
  7. maps:
  8. name: sangeng
  9. age: 11
  10. maps2: {name: caotang,age: 199}
  11. list:
  12. - name: 小白
  13. age: 3
  14. - name: 小黄
  15. age: 4
  16. - {name: 小黑,age: 1}
  17. dog:
  18. name: 小红
  19. age: 5
  20. arr:
  21. - sangeng
  22. - caotang
  23. arr2: [sangeng,caotang]
  24. dogMap:
  25. xb: {name: 小白,age: 9}
  26. xh:
  27. name: 小红
  28. age: 6
  1. @Data
  2. @AllArgsConstructor
  3. @NoArgsConstructor
  4. @Component
  5. @ConfigurationProperties(prefix = "student")
  6. public class Student {
  7. private String lastName;
  8. private Integer age;
  9. private Boolean boss;
  10. private Date birthday;
  11. private Map<String,String> maps;
  12. private Map<String,String> maps2;
  13. private List<Dog> list;
  14. private Dog dog;
  15. private String[] arr;
  16. private String[] arr2;
  17. private Map<String,Dog> dogMap;
  18. }
  19. @Data
  20. @AllArgsConstructor
  21. @NoArgsConstructor
  22. class Dog {
  23. private String name;
  24. private Integer age;
  25. }

5.5 YML和properties配置的相互转换

  1. 我们可以使用一些网站非常方便的实现YMLproperties格式配置的相互转换。

转换网站:https://www.toyaml.com/index.html

5.6 配置提示

  1. 如果使用了@ConfigurationProperties注解,可以增加以下依赖,让我们在书写配置时有相应的提示。
  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-configuration-processor</artifactId>
  4. <optional>true</optional>
  5. </dependency>
  1. **注意:添加完依赖加完注解后要运行一次程序才会有相应的提示。**