言成言成啊 | Kit Chen's Blog

SpringBoot

一、简介

1.1 spring优缺点

优点

  1. 提供了依赖注入
  2. 面向切面编程
  3. 可选注解或者xml

缺点

  1. spring组件是轻量级的,但是配置却是重量级的。也就是少写了代码,多写了配置
  2. 依赖管理也费事费力,如版本问题。

1.2 springboot概述

springboot对spring的优缺点进行了改善和优化。基于约定优于配置的思想,让开发人员可以只关心逻辑实现,而不用再去为配置耗时。从而提高了开发效率,缩减项目周期。

springboot的特点

  1. 为基于spring开发提供更快的入门体验
  2. 开箱即用,没有代码生成,也无需xml配置
  3. 提供大型项目中常见的非功能特性,如嵌入式服务器(springboot本身内置了tomcat服务器,不需要在打包放到tomcat里面跑)、安全、指标、健康检测(我现在工作就用了健康检测)等
  4. springboot只是提供了快速使用spring的方式

1.3 springboot核心功能

核心功能

  1. 起步依赖
    • 本质上就是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。简单说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认功能
  2. 自动配置
    • 应用启动时,需要用到哪个配置,就会自动配置

二、入门

2.1 快速入门

步骤

  1. 创建Maven工程,普通的java工程即可
  2. 添加springboot的起步依赖
  3. 添加springboot的引导类
  4. 创建控制器

就普通的maven工程即可

SpringBoot要求,项目要继承SpringBoot的起步依赖,spring-boot-starter-parent

1
2
3
4
5
6
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

SpringBoot要集成SpringMVC进行Controller开发,所以项目要导入web的启动依赖

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

总配置文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>top.meethigher</groupId>
<artifactId>SpringBoot</artifactId>
<version>1.0</version>

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

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

</project>

添加控制器如下

1
2
3
4
5
6
7
8
@Controller
public class QuickController {
@RequestMapping("/quick")
@ResponseBody
public String quick(){
return "Hello Spring Boot";
}
}

@Controller和@ResponseBody可以通过@RestController来替换。添加了@RestController就可以不用再写那两个了。

添加引导类

1
2
3
4
5
6
7
@SpringBootApplication//声明该类是springboot的引导类
public class Start01 {
public static void main(String[] args) {
//run方法,表示运行springboot的引导类,run参数就是springboot引导类的字节码对象
SpringApplication.run(Start01.class);
}
}

访问localhost:8080/quick即可。

2.2 springboot的热部署

首先pom中导入热部署依赖

1
2
3
4
5
<!--热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>

其次,idea开启自动编译功能

第一步,设置里面开启自动编译

第二部,ctrl+shift+alt+/找到Registry

2.3 借助idea快速创建springboot工程

用spring初始化这个工具

在下面可以选择自己的依赖,比如热部署的、web开发的。

三、原理

3.1 起步依赖

pom选中要看的依赖,ctrl左键就能看到相应的pom,如果没反应的话,尝试重启idea,或者去maven仓库看一下,到底有没有下载下来

像spring-boot-starter-parent,我们可看他里面的指定配置文件名称等的内容,还可以继续看他的父级spring-boot-dependencies,然后就能看到springboot内置的一些依赖。

这样就算是统一了,不用担心自己导依赖的时候,有版本问题

3.2 自动配置

@SpringBootApplication注解的作用,相当于以下三个

  • @SpringBootConfiguration:查看源码,可以知道相当于@Configuration,指定当前类是个配置类
  • @ComponentScan:扫描包
  • @EnableAutoConfiguration:是否自动配置的开关。源码里面有@Import用于引入其他配置类

通过@EnableAutoConfiguration

我们就可以找到许多自动配置,里面配置了许多默认属性。

如果我们想要更改默认配置,只需要在springboot的配置文件中,添加server.port属性即可。

如果是用的mybatis启动器,那么也可以这么找来配置。

找到mybatis的autoconfigure,然后找到配置json,搜索指定关键字就能找到了。

比如

1
2
server.port=444
server.servlet.context-path=/demo

或者

1
2
3
4
server:
port: 8080
servlet:
context-path: /demo

四、配置

springboot的配置文件有两种,properties和yml(yaml),下面使用yml来演示

4.1 yml配置文件

yml文件格式是YAML(YAML Aint Markup Language)编写的文件格式,类似于json的格式。

扩展名可以为.yml或者.yaml

配置普通数据

语法

1
key: value

注意

value之前要带空格

配置对象数据

语法

1
2
3
key:
key1: value1
key2: value2

或者

1
key: {key1: value1,key2: value2}

配置集合数据

如果集合中存的是普通数据

1
2
3
4
city:
- taian
- changchun
- wuhan

或者

1
city: [taian,changchun,wuhan]

如果集合中存的是对象数据

1
2
3
4
5
6
7
8
9
10
student:
- name: ccc
age: 18
addr: taian
- name: ccc
age: 19
addr: changchun
- name: ccc
age: 24
addr: wuhan

或者

1
student: [{name:ccc,age:18,addr:taian},{name:ccc,age:19,addr:changchun},{name:ccc,age:24,addr:wuhan}]

相当于存的三个数据,都是一个对象

4.2 获取配置文件内容

两种方式

  1. @Value:适合直接取值
  2. @ConfigurationProperties:适合多个属性的一起取

配置文件

1
2
3
4
5
6
7
8
9
server:
port: 8080
servlet:
context-path: /demo
name: ccc
person:
name: ccc
age: 14
addr: wuhan

@Value的示例

1
2
3
4
5
6
7
8
9
10
11
12
@RestController
public class Quick2Controller {
@Value("${name}")
private String name;
@Value("${person.addr}")
private String addr;
@RequestMapping("/quick2")
public String quick2(){
//获取配置文件信息
return addr;
}
}

@ConfigurationProperties的示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
@RestController
@ConfigurationProperties(prefix = "person")
public class Quick3Controller {
private String name;
private String addr;
private Integer age;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getAddr() {
return addr;
}

public void setAddr(String addr) {
this.addr = addr;
}

public Integer getAge() {
return age;
}

public void setAge(Integer age) {
this.age = age;
}

@RequestMapping("/quick3")
public String quick2(){
//获取配置文件信息
return getName()+getAddr()+getAge();
}
}

pom中添加@ConfigurationProperties自动提示执行器的依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version>
</parent>
<groupId>top.meethigher</groupId>
<artifactId>SpringBoot</artifactId>
<version>1.0</version>

<dependencies>
<!--集成springmvc的web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<!--@ConfigurationProperties的执行器配置,
方便在配置了@ConfigurationProperties之后,
在boot的配置文件中自动提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>

五、整合

5.1 springboot整合mybatis

步骤

  1. 添加mybatis的起步依赖
  2. 添加数据库驱动坐标
  3. 添加数据库连接信息
  4. 创建表
  5. 创建bean
  6. 编写Mapper
  7. 配置Mapper映射文件
  8. 在application.yml添加mybatis
  9. 添加控制器

pom如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>top.meethigher</groupId>
<artifactId>springboot_mybaits</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot_mybaits</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--mybatis起步依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--junit单元测试启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

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

</project>

springboot配置

1
2
3
4
5
6
7
8
9
10
#数据库
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
#配置mybatis信息
#pojo别名扫描包
mybatis.type-aliases-package=top.meethigher.springboot_mybaits.domain
#映射扫描包
mybatis.mapper-locations=classpath:mapper/*Mapper.xml

实体类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class Account {
private Integer id;
private String name;
private Float money;

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Float getMoney() {
return money;
}

public void setMoney(Float money) {
this.money = money;
}

@Override
public String toString() {
return "Account{" +
"id=" + id +
", name='" + name + '\'' +
", money=" + money +
'}';
}
}

Mapper

1
2
3
4
@Mapper
public interface AccountMapper {
List<Account> findAll();
}

控制器

1
2
3
4
5
6
7
8
9
10
@RestController
public class AccountController {
@Autowired
private AccountMapper accountMapper;
@RequestMapping("/findAll")
public List<Account> findAll(){
List<Account> all = accountMapper.findAll();
return all;
}
}

5.2 springboot整合junit

导入junit的起步依赖。因为springboot2.4.5使用的是junit5.7.1,所以跟4有点不同。

测试类这么写

1
2
3
4
5
6
7
8
9
10
11
@SpringBootTest
public class MybatisTest {

@Autowired
private AccountMapper accountMapper;

@Test
void testFindAll() {
System.out.println(accountMapper.findAll());
}
}

5.3 springboot整合jpa

pom

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>top.meethigher</groupId>
<artifactId>springboot_jpa</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot_jpa</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

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

实体类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
@Entity
@Table(name="person")
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer uId;
private String uName;
private Integer uAge;
private String uAddr;

public Integer getuId() {
return uId;
}

public void setuId(Integer uId) {
this.uId = uId;
}

public String getuName() {
return uName;
}

public void setuName(String uName) {
this.uName = uName;
}

public Integer getuAge() {
return uAge;
}

public void setuAge(Integer uAge) {
this.uAge = uAge;
}

public String getuAddr() {
return uAddr;
}

public void setuAddr(String uAddr) {
this.uAddr = uAddr;
}

@Override
public String toString() {
return "Person{" +
"uId=" + uId +
", uName='" + uName + '\'' +
", uAge=" + uAge +
", uAddr='" + uAddr + '\'' +
'}';
}
}

接口

1
2
public interface PersonRepository extends JpaRepository<Person,Integer> {
}

springboot配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#数据库
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai

#配置jpa 这个就在springboot自带的配置里
spring.jpa.database=mysql
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.generate-ddl=true
# 根据属性自己创建数据库名称,无需@Column
# https://blog.csdn.net/zhaow823/article/details/81975317
spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy

测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@SpringBootTest
class SpringbootJpaApplicationTests {

@Autowired
PersonRepository personRepository;
@Test
void contextLoads() {
Person person = new Person();
person.setuName("hh");
person.setuAge(10);
person.setuAddr("武汉");
personRepository.save(person);
List<Person> all = personRepository.findAll();
System.out.println(all);
}

}

5.4 springboot整合Redis

pom

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>top.meethigher</groupId>
<artifactId>springboot_redis</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot_redis</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>

</project>

springboot配置

1
2
spring.redis.host=127.0.0.1
spring.redis.port=6379

测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@SpringBootTest
class SpringbootRedisApplicationTests {

@Autowired
private RedisTemplate<String,String> redis;
@Test
void contextLoads() {
//1.从redis中获得数据,数据形式json字符串
String s = redis.boundValueOps("user.findAll").get();
//2.判断redis中是否存在数据,不存在就从数据库查,否则就直接缓存返回并打印
if(s==null){
redis.boundValueOps("user.findAll").set("哈哈哈哈");
}
System.out.println(s);
}

}
发布:2021-04-25 02:22:05
修改:2021-04-25 02:26:31
链接:https://meethigher.top/blog/2021/springboot/
标签:spring 
付款码 打赏 分享
阅读量