Hello!彦祖们,从今天开始我将更新一波超详细的SpringBoot的图文教程,感兴趣的老铁给个关注+点赞 支持一下呗,最好再评论一个666,O(∩_∩)O哈哈~(贪心了)
==============点个关注吧============
==================================
02. SpringBoot配置
SpringBoot使用一个全局的配置文件,配置文件名是固定的:
- application.properties
语法结构:key=value
- application.yml
语法结构: key: value
- 以前的配置文件;大多都使用的是 xxxx.xml 文件;
- YAML:以数据为中心,比 json、xml 等更适合做配置文件;
💬 比如我们可以在配置文件中修改 Tomcat 默认启动的端口号
YAML:
server:
port: 8081
properties:
server.port=8081
🌲 YAML 语法
🌾 基本写法
k: v
:表示一对键值对(空格必须有)
以空格的缩进来控制层级关系,只要是左对齐的一列数据,都是同一个层级的
server:
port: 8081
path: /hello
🌾 值的写法
🍁 字面量:普通的值(数字,字符串,布尔)
字面量直接写在后面就可以 , 字符串默认不用加上双引号或者单引号;
k: v
" "
:双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
💬 例如:
name: "zhangsan \n lisi"
输出:
zhangsan
lisi
' '
:单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据
💬 例如:
name: ‘zhangsan \n lisi’
输出:
zhangsan \n lisi
🍁 Map(属性和值)(键值对)
k: v
:在下一行来写对象的属性和值的关系,注意缩进
#对象、Map格式
k:
v1:
v2:
💬 例如:
friends:
lastName: zhangsan
age: 20
行内写法:
friends: {lastName: zhangsan,age: 18}
🍁 数组(List、Set)
用 - 值
表示数组中的一个元素
💬 例如:
pets:
- cat
- dog
- pig
行内写法
pets: [cat,dog,pig]
🌲 全局配置文件值注入
🌾 全局配置文件注入
📜 需要导入配置文件处理器的依赖,配置文件进行绑定就会有提示(不加也行,只是没有提示)
<!-- 导入配置文件处理器,配置文件进行绑定就会有提示,需要重启 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
注入步骤:
- 在resources中新建application.yml或者application.properties配置文件,添加如下配置:
🍁配置文件yaml格式:
person:
lastName: 二郎神
age: 18
boss: false
birth: 2017/12/12
maps: {wife: 小甜甜, money: 300000}
friends:
- 王刚
- 张龙
- 赵虎
dog:
name: 哮天犬
age: 12
🍁 配置文件properties格式:
person.last-name=zsf
person.age=100
person.birth=2017/12/15
person.boss=true
person.maps.k1=tj
person.maps.k2=yj
person.lists=a,b,c
person.dog.name=dog
person.dog.age=15
🚨 注意:properties 配置文件在 IDEA 中默认 utf-8 可能会乱码,如图进行相应设置:
添加实体类:Dog.java
package com.moxuan.demo.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Dog {
private String name;
private Integer age;
}
添加实体类:Person.java
package com.moxuan.demo.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Component
// 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
@ConfigurationProperties(prefix = "person")
// prefix="person" 表示与配置文件中的哪一个属性进行一一映射
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> friends;
private Dog dog;
}
- @ConfigurationProperties 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
- prefix="person" 表示与配置文件中的哪一个属性进行一一映射.
控制器代码如下:
package com.moxuan.demo.controller;
import com.moxuan.demo.entity.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyShowController {
@Autowired
Person person;
@RequestMapping("test")
public String show(){
System.out.println(person);
return person.toString();
}
}
注意: 当properties文件和yml配置文件同时存在时,会优先选择properties文件,当properties配置文件没有时,会去yml中查找。
🌲 @Value值注入
可以使用 @Value
注解从配置文件中手动取值或者自由赋值,支持三种方式:
${key}
从环境变量、配置文件中获取值
@Value("${person.last-name}")
private String lastName;
# {SpEL}
@Value("#{11*2}")
private Integer age;
- "字面量"
@Value("true")
private Boolean boss;
修改配置文件如下:
person:
last-name: 二郎神
age: 18
boss: false
birth: 2017/12/12
maps: {wife: 小甜甜, money: 300000}
friends:
- 王刚
- 张龙
- 赵虎
dog:
name: 哮天犬
age: 12
Person类如下:
package com.moxuan.demo.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Component
// 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
@ConfigurationProperties(prefix = "person")
// prefix="person" 表示与配置文件中的哪一个属性进行一一映射
@Data
@NoArgsConstructor
@AllArgsConstructor
@Validated
public class Person {
@Value("${person.last-name}")
private String lastName;
@Value("#{11*2}")
private Integer age1;
@Value("true")
private Boolean boss1;
private Date birth;
private Map<String,Object> maps;
private List<Object> friends;
private Dog dog;
}
控制器层:
package com.moxuan.demo.controller;
import com.moxuan.demo.entity.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyShowController {
@Autowired
Person person;
@RequestMapping("test")
public String show(){
System.out.println(person);
return person.toString();
}
}
运行效果:
🌲 全局注入和@Value注入比较
@ConfigurationProperties | ||
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
💡 松散绑定:比如 yml 中写的 last-name
,这个和 lastName
是一样的, -
后面跟着的字母默认是大写的。这就是松散绑定。
无论配置文件是 yml
还是 properties
他们都能获取到值;
- 如果只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用
@Value
;
@RestController
public calss HelloController{
@Value("${person.lastName}")
private String name;
@RequestMapping("/sayHello")
public String sayHello(){
return "Hello" + name;
}
}
- 如果我们专门编写了一个 JavaBean 来和配置文件进行映射,就直接使用
@ConfigurationProperties
🌲 @PropertySource 指定配置文件值注入
@ConfigurationProperties(prefix = "person")
默认从全局配置文件中获取值,如果所有的配置全写在全局配置文件中,那么这个文件就太大了。我们可以自定义配置文件使用 @PropertySource
加载指定的配置文件。
比如我们在 resources 目录下新建一个 person.properties
文件
person.last-name=zsf
person.age1=100
person.birth=2017/12/15
person.boss1=true
person.maps.k1=tj
person.maps.k2=yj
person.friends=a,b,c
person.dog.name=dog
person.dog.age=15
Person中使用方法:
package com.moxuan.demo.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Component
// 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
//@ConfigurationProperties(prefix = "person")
// prefix="person" 表示与配置文件中的哪一个属性进行一一映射
@PropertySource(value = {"classpath:person.properties"})
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
@Value("${person.last-name}")
private String lastName;
@Value("#{11*2}")
private Integer age1;
@Value("true")
private Boolean boss1;
private Date birth;
private Map<String,Object> maps;
private List<Object> friends;
private Dog dog;
}
🌲 Profile 多环境切换
profile 是 Spring 对不同环境提供不同配置功能的支持,可以通过激活不同的环境版本,实现快速切换环境 👇
🌾 多配置文件
我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml
比如:application-dev.properties 、application-prod.properties
其中,application-dev.properties 通常用作开发环境的配置,而application-prod.properties通常用作生产环境的配置。
默认使用 application.properties 的配置,然后在其中指定具体使用哪种环境的配置。
🌾 激活指定环境
⭐ 在 application.properties 配置文件中指定
spring.profiles.active=dev
🌾 yml 支持多文档块方式
和 properties配置文件中一样,但是使用 yml去实现不需要创建多个配置文件,更加方便了~
在 application.yml 中使用 --- 来分割不同的配置,内容如下
server:
port: 8080 # 默认端口
#选择要激活那个环境块
spring:
profiles:
# 激活
active: prod # 使用 prod 环境,8084端口
---
server:
port: 8083
spring:
config:
activate:
on-profile: dev #给开发环境起的名字
---
server:
port: 8084
spring:
config:
activate:
on-profile: prod #给生产环境起的名字
---
#测试
spring:
profiles: test #给测试环境起的名字
server:
port: 82
---
此时访问8080端口就会访问不到:
而访问8084端口可以访问到
🌲 配置文件分类
有这样的场景,我们开发完毕后需要测试人员进行测试,由于测试环境和开发环境的很多配置都不相同,所以测试人员在运行我们的工程时需要临时修改很多配置.
针对这种情况,SpringBoot 定义了配置文件不同的放置的位置;而放在不同位置的优先级时不同的。
SpringBoot 中4级配置文件放置位置:
- 1级:classpath:application.yml
- 2级:classpath:config/application.yml
- 3级:file :application.yml
- 4级:file :config/application.yml
🌾 验证1,2级优先级
创建一个名为 boot_02_file 的 SpringBoot 工程,目录结构如下:
在 resources 下创建一个名为 config 的目录,在该目录中创建 application.yml 配置文件,而在该配置文件中将端口号设置为 81,内容如下
server:
port: 81
而在 resources 下创建的 application.yml 配置文件中并将端口号设置为 80,内容如下
server:
port: 80
运行启动引导类,可以在控制台看到如下日志信息
通过这个结果可以得出---类路径下的 config 下的配置文件优先于类路径下的配置文件。
🌾 验证2,4级优先级
将工程打成 jar 包,点击工程的 package 来打 jar 包:
在硬盘上找到 jar 包所在位置
在 jar 包所在位置创建 config 文件夹,在该文件夹下创建 application.yml 配置文件,而在该配合文件中将端口号设置为 82
server:
port: 82
在命令行跳转到jar包所在的目录,然后使用以下命令运行程序:
java -jar boot_02_file-0.0.1-SNAPSHOT.jar
运行效果:
可以看出启动的是82端口,也就是用的是jar包同级目录config中的配置文件,由此可见,file: config 下的配置文件优先于类路径下的配置文件。