【02】SpringBoot-配置方式
文章目录
- 【02】SpringBoot-配置方式
- 一、配置文件
- 1.1、yaml语法
- 1.2、Properties文件配置
- 1.3、配置文件占位符
- 1.4 补充:
- 二、JSR303校验
- 三、几个注解的区别
- 四、多环境切换
- 4.1 配置文件的位置及优先级
- 4.2 环境切换
- 4.3 外部配置加载顺序
一、配置文件
SpringBoot使用一个全局的配置文件,配置文件名是固定的;
application.properties
application.yml
配置文件的作用:修改SpringBoot自动配置的默认值;
1.1、yaml语法
- 格式:
key: value
(需要使用一个空格隔开) - 配置文件类型加载顺序:
yml
>yaml
>properties
(后面会覆盖前面的配置)
- 基本语法:
# 普通数据
name: libai
# 对象的配置
person:
name: libai
age: 2
addr: jiangxi
# 行内对象配置
#student: {name: libai, age: 18, addr: shanghai}
# 配置端口,项目虚拟目录,覆盖springboot配置
server:
port: 8083
servlet:
context-path: /hello
# 配置数组、集合(List,Set
# 1,数组内容:字符串
season:
- spring
- summer
- winter
- autumn
# 行内配置,用的不多
#season: [spring,summer,winter,autumn]
#2,集合内容:对象数据
students:
- name: libai
age: 12
addr: beij
- name: lishi
age: 13
addr: hebei
# 行内配置对象
#student2: [{name: lishi,age: 12,addr: beij},{name: lishi2,age: 112,addr: beij}]
# Map配置
map:
name1: xuxu
name2: yaya
- 示例:
使用的注解: | 作用: |
| 和配置文件建立关联,并使用指定的前缀去匹配对象属性 |
- 可以和
application.yaml
和application.properties
建立关联- 要求对象提供
getter/setter()
方法
@Component // 放入IOC容器
@ConfigurationProperties(prefix = "book") //
@Validated // JSR303校验
public class Book {
@NotNull
private String name;
private Author author;
private Integer price;
private boolean isPublic;
private Date pubTime;
private List<Object> list;
private Map<String,String> maps;
//getter()/setter()省略
}
对应的application.yml
# 还可以使用SPEL生成随机数,以及复用配置好的对象属性
book:
name: 活着${random.uuid}
author:
name: 余华
age: 100${book.price}
price: 18
isPublic: false
pubTime: ${myTime:1999/11/11} # 默认使用myTime,没有使用1999/11/11
list:
- adult
- child
- older
maps:
key1: 不错哦
key2: 很好看
# 另外配置一个时间
myTime: 1998/12/12
application.properties
对应的properties应该怎样配置?
book.name=活着
book.author.name=余华
book.author.age=23
book.price=100
book.isPublic=true
book.pubTime=1999/11/11
book.list={adult,child,older}
book.maps.key1=val1
book.maps.key2=val2
1.2、Properties文件配置
application.properties
# 属性注入
p.name=BaoBao
p.age=12
- 关联类:
使用的注解: | 作用: |
@PropertySource(value = “classpath:文件名”) | 表示使用指定的配置文件,配合@Value注解使用 |
@Value("${键名}") | 取出配置文件中”键名“对应的数据 |
注意:
@PropertySource
只是将被注解的类和配置文件建立关联,需要配合@Value
一个个取出数据@Value
可以单独使用,也可配合上面的注解使用
@Component
@PropertySource(value = "classpath:application.properties")
public class User {
@Value("${p.name}")
private String name;
@Value("${p.age}")
private Integer age;
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
什么是松散绑定?比如:配置文件中last-name
可以绑定到对象属性lastName
上
- properties配置文件乱码解决:
1.3、配置文件占位符
1.4 补充:
1.使用指定位置的配置文件
spring.config.location=classpath:/myconfig/
2.使用指定名称的配置文件
spring.config.name=app
# app.yml 或 app.properties
二、JSR303校验
位于
import javax.validation.constraints.Email;
Constraint | 详细信息 |
| 被注释的元素必须为 |
| 被注释的元素必须不为 |
| 被注释的元素必须为 |
| 被注释的元素必须为 |
| 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
| 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
| 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
| 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
| 被注释的元素的大小必须在指定的范围内 |
| 被注释的元素必须是一个数字,其值必须在可接受的范围内 |
| 被注释的元素必须是一个过去的日期 |
| 被注释的元素必须是一个将来的日期 |
| 被注释的元素必须符合指定的正则表达式 |
表 2. Hibernate Validator 附加的 constraint
Constraint | 详细信息 |
| 被注释的元素必须是电子邮箱地址 |
| 被注释的字符串的大小必须在指定的范围内 |
| 被注释的字符串的必须非空 |
| 被注释的元素必须在合适的范围内 |
使用示例:
注解中
message字段
表示错误提示信息
import org.springframework.stereotype.Component;
import javax.validation.constraints.Email;
@Component
public class Author {
@Email(message = "邮箱格式错误") // 添加了一个邮件校验
private String name;
@NotNull(message="年龄不能为空")
private int age;
// get,set,toString()
}
三、几个注解的区别
注解名称 | 作用: |
@PropertySource | 使用指定的配置文件,不能单独使用。需要配合@Value |
@ImportResource | 导入Spring的配置文件,让配置文件里面的内容生效;Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;想让Spring的配置文件生效,加载进来;@lmportResource标注在一个配置类上 |
@Value | 默认也是从全局配置文件获取值,但可以配合@PropertySource从指定配置文件获取值 |
@ConfigurationProperties | 默认从全局配置文件中获取值,通过前缀(prefix)匹配值 |
四、多环境切换
4.1 配置文件的位置及优先级
优先级:从上到下,依次降低。优先使用高优先级配置,然后再配合其他优先级形成互补配置
我们还可以通过
spring.config.location
来改变默认的配置文件位置项目打包好以后,可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定配置文件认加载的这些配置文件共同起作用形成互补配置;
4.2 环境切换
- 再创建2个配置文件
- application-dev.properties:开发环境
- application-test.properties:测试环境
在application.properties
中指定使用哪一个配置
# 使用dev环境
spring.profiles.active=dev
- yml支持多文档块方式 【使用分隔符—
# 使用分隔符代表多个文档
# active:指定当前使用的环境
spring:
profiles:
active: dev
---
# 开发环境
server:
port: 8084
spring:
profiles: dev
---
# 测试环境
server:
port: 8085
spring:
profiles: test
4.3 外部配置加载顺序
SpringBoot也可以从以下位置加载配置; 优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会 形成互补配置
- 命令行参数
所有的配置都可以在命令行上进行指定 ,多个配置参数使用空格隔开
# 多个配置用空格分开; --配置项=值
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc
- 来自java:comp/env的JNDI属性
- Java系统属性(System.getProperties())
- 操作系统环境变量
- RandomValuePropertySource配置的random.*属性值
【 由jar包外向jar包内进行寻找; 优先加载带profile(开发环境) 】
注意:Jar包和外部配置文件处于同一目录
- jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
- jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
【再加载不带profile的】
- jar包外部的application.properties或application.yml(不带spring.profile)配置文件
- jar包内部的application.properties或application.yml(不带spring.profile)配置文件
- @Configuration注解类上的@PropertySource
- 通过SpringApplication.setDefaultProperties指定的默认属性