前言
1、SpringBoot 快速入门
1.1、SpringBoot 简介
- SpringBoot 是用来简化 Spring 应用的初始搭建以及开发过程
首先我们回顾一下 SpringMVC 项目的开发过程:
- 导入依赖(javax.servlet-api 和 spring-webmvc)
- Servlet 容器配置类(在这里设置 SpringMVC 来处理所有请求)
- SpringMVC 容器配置类
- 创建 Controller 类
1.2、SpringBoot 项目创建的两种方式
1.2.1、手动创建
这里我们不再是创建 Maven 工程了,而是创建一个 Spring Initialzr 项目:
然后选择 SpringBoot 版本并勾选 SpringbWeb:
创建好工程后,我们只需要保留 src 目录和 pom.xml,别的文件都可以删了。
SpringBoot 程序并不需要像开发 SpringMVC 程序那样一上来先创建 ServletConfig、SpringMvcConfig 这些配置类,我们只需要写一个 Controller 类:
@RestController
@RequestMapping("/books")
public class BookController {
@GetMapping("/{id}")
public String getById(@PathVariable Integer id){
System.out.println("id => " + id);
return "hello springboot";
}
}
接着写一个执行类:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
不用配置 Tomcat 直接执行,然后访问 local:8080/books/1
查看控制台输出:
恐怖如斯!!!我们啥都没干,就写了一个 Controller 类!!!
1.2.2、Spring 官网创建
打开 start.spring.io
下载项目之后,我们查看 pom.xml:
可以看到,和我们在 Idea 创建的项目 pom.xml 中的核心依赖是一样的,只不过这里的 SpringBoot 版本最低就是 3.2.4 ,JDK 版本必须 JDK17+。
1.3、SpringBoot 快速启动
SpringBoot 程序可以不依赖 Tomcat 和 Idea 直接运行,但是数据库必须得有。所以前后端开发 Web 程序的过程中,后端程序员只需要给前端程序媛一个 jar 包和数据库建表语句即可。
打包 SpringBoot 项目:
重点是要有这个打包插件:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<addResources>true</addResources>
<mainClass>com.lyh.Application</mainClass>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
在 idea 用 package 打包程序,在 jar 包目录输入 cmd 使用 java -jar 命令执行并在浏览器访问 localhost:8080/books/1 :
这样我们的项目就可以摆脱对 Idea 和 Tomcat 的依赖随处运行了。
1.4、起步依赖
为什么 SpringBoot 可以帮我自动处理好依赖之间的关系,而使得我们几乎不需要自己导入任何依赖呢,这其实主要归功于它帮我把所有的依赖都导进来了:
SpringBoot 的三个核心依赖:
<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>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
我们可以打开查看一下:
可以看到,光是一个 spring-boot-dependencies 中帮我们管理了接近两百个依赖,而下面的 spring-boot-starter-web 和 spring-boot-starter-test 同样帮我们导入了 tomcat、servlet、springmvc 等依赖。
所以 SpringBoot 的起步依赖通过帮我们来管理依赖,已达到减少依赖冲突的目的。
1.5、切换 Web 服务器
上面我们打包的 SpringBoot 程序会内置一个 tomcat,所以我们可以在别的地方运行,这是因为 spring-boot-starter-web 帮我们导入了 tomcat 的依赖,但是如果我们不希望使用 tomcat 又该怎么办?tomcat 是内置的依赖,我们怎么排除掉?
<!-- 排除tomcat依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 导入jetty依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
<version>2.5.0</version>
</dependency>
启动项目:
所以,之后当遇到版本依赖需要替换依赖的情况我们都可以这么干!相比较 Tomcat,Jetty 更加轻量级,可扩展性更强。
2、基础配置
2.1、配置文件格式(3种)
2.1.1、修改服务器端口
现在我们启动的项目端口默认就是 8080,那如果我们要修改的话,就需要进行配置。
- applicantion.properties
server.port=80
- 创建一个 application.yml (SpringBoot 项目中我们的配置文件都用 application.x 的格式)
server:
port: 80
注意:port: 和 80 之间一定要有空格
- 创建一个 application.yaml(相比较 application.yml 只是扩展名不同,内容都一样)
server:
port: 80
Idea 设置 SpringBoot 配置文件提示功能:
我们之后写 application.yml 更多一些,如果三个文件都存在,则优先级: application.properties > application.yml > application.yaml 。
2.1.2、yaml
- YAML (Ain't Markup Language),一种数据序列化格式
- 优点:
- 容易阅读
- 容易与脚本语言交互
- 以数据为核心,重数据轻格式
- YAML 扩展名
- .yml(主流)
- .yaml
语法规则:
- 大小写敏感
- 属性层级关系使用多行描述,每行结尾用冒号结束
- 使用缩进表示属性层级关系,同层级左侧对齐,只允许使用空格(不允许 Tab 键)
- 属性值前面必须添加空格
- # 表示注释
- 数组数据使用 '-' 表示开始
2.1.3、yaml 数据读取方式(3种)
先在 application.yml 中添加下面的内容
student:
name: tom
age: 15
subject:
- Math
- English
- Chinese
(1)@Value (直接读取)
@Value("${student}")
private String student;
@Value("${server.port}")
private Integer port;
@Value("${student.subject[0]}")
private String subject0;
(2)Environment (封装后读取)
@Autowired
private Environment environment;
// 用的时候直接调用
System.out.println(environment.getProperty("server.port"));
System.out.println(environment.getProperty("student.subject[0]"));
(3)实体类封装(常用)
在 domain 包下创建一个 Student 对象,这个对象必须被 SpringBoot 管理,所以使用 @Component 注解来标识;而且这里需要指定配置名称,所以用 @ConfigurationProperties 来表示属性名:
@Component
@ConfigurationProperties(prefix = "student")
public class Student {
private String name;
private Integer age;
private String[] subject;
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", subject=" + Arrays.toString(subject) +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String[] getSubject() {
return subject;
}
public void setSubject(String[] subject) {
this.subject = subject;
}
}
用的时候直接用 student 对象的 get 方法即可。
@Autowired
private Student student;
// 用的时候调用get方法
System.out.println(student.getAge());
包括之后我们配置 Mybatis 也会通过这种方式来配置。
如果遇到对象封装警告,需要导入 Maven 依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
2.2、多环境开发
在不同的环境下我们往往使用的配置不同,那我们应该怎么设置?
2.2.1、yaml 文件多环境启动
通过 "---" 来区分不同的环境,通过 spring: profiles: active 来指定我们上线时使用的环境信息:
spring:
profiles:
active: dev
---
# 开发环境
spring:
profiles: dev
server:
port: 85
---
# 生产环境
spring:
profiles: pro
server:
port: 86
---
# 测试环境
spring:
profiles: test
server:
port: 87
这里的配置过时了,我们也可以换用这种格式:
spring:
config:
activate:
on-profile: dev
server:
port: 85
2.2.2、application.properties 文件多环境启动
spring.config.activate.on-profile=dev
创建 application-dev.properties:
server.port=85
创建 application-dev.properties:
server.port=85
2.2.3、多环境启动命令格式
在实际开发过程中,我们的程序打包后总是有一个我们指定的环境(比如我们这里的yml文件:spirng.profiles.active: dev)
打包程序(先设置编码格式,防止 SpringBoot 中的配置文件中文乱码,即使是中文注释):
如果打包后的 jar 包只有几 KB,那指定是打包出问题了,看看 pom.xml 中的这里:
测试结果:
普通启动:
我们看到,启动的端口是 85,我们现在指定环境为 test:
java -jar springboot-demo1-0.0.1-SNAPSHOT.jar --spring.profiles.active=test
可以看到,端口被切换为 87
2.2.4、多环境开发兼容性问题
在 SpringBoot 和 Maven 都有 profile 配置的情况下,SpringBoot 的配置应该听从于 Maven ,也就是说 Maven 应该占据主导地位。
Maven 中设置多环境属性
<profiles>
<!-- 开发环境 -->
<profile>
<id>dev</id>
<properties>
<profile.active>dev</profile.active>
</properties>
</profile>
<!-- 生产环境 -->
<profile>
<id>pro</id>
<properties>
<profile.active>pro</profile.active>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!-- 测试环境 -->
<profile>
<id>test</id>
<properties>
<profile.active>test</profile.active>
</properties>
</profile>
</profiles>
SpringBoot 中引用 Maven 属性
spring:
profiles:
active: ${profile.active}
对资源文件开启默认占位符的解析
这里需要引入一个插件来将我们 Maven 中配置的<profile.active>属性值加载到 application.yml 中的占位符 ${profile.active} 当中:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<encoding>UTF-8</encoding>
<useDefaultDelimiters>true</useDefaultDelimiters>
</configuration>
</plugin>
未导入插件前:
导入插件后,我们解压打包好的 jar 包后就会发现Maven中的属性值被成功加载到 application.yml:
2.3、配置文件分类
- SpringBoot 中4级配置文件等级(从高到低)
- 1级:config/application.yml(jar包所在目录下的config目录)
- 2级:application.yml(jar包所在目录)
- 3级:classpath: config/application.yml(jar包内的路径/Maven工程的resources目录下的config目录)
- 4级:classpath: application.yml(jar包内的路径/Maven工程的resources目录)
所以,如果我们测试的时候希望修改某个配置属性,可以通过前两种方式对属性进行覆盖。
编辑一个 application.yml:
server:
port: 88
放到 jar 包所在目录
测试:
可以看到,jar 包内的配置端口=85 被覆盖掉了。