yml配置文件的特点:简洁,层级清晰、可读性强,可以配置多种数据类型
#数值型的值,long、float不要加L、F之类的后缀
id: 1
#字符串类型的值,不引、单引、双引均可,如果值包含空格、冒号等yml预定义字符,则需要加引号
name: chy
#布尔类型
enable: false
# 数组、list、set,以下3种写法均可,英文逗号后面带不带1个空格均可,-后面带1个空格
city1: beijing,shanghai,guangzhou,shenzhen
city2: [beijing,shanghai,guangzhou,shenzhen]
city3:
- beijing
- shanghai
- guangzhou
- shenzhen
#对象、map,以下2种写法均可,放在{}中时key:后面也需要带一个空格
user1:
id: 1
name: chy
user2: {id: 1, name: chy}
#标准语法是冒号+缩进,当然,不使用缩进、直接点号分隔也行
user.id: 1
user.name: chy
#支持嵌套
user:
id: 1
name: chy
teacher: zhangsan,lisi,wangwu
socre:
chinese: 90
math: 100
english: 80
可以使用框架、组件预定义的配置项,也可以自定义配置项
1、@Value可以用 ${ } 取配置文件中的值,也可以使用SpEL #{ }
@Value("#{2+3}") // #{}
private int n;
@Value("${server.port}") // ${}
private String port;
${ }、#{ } 可以用于@Value注入,也可以用在模板引擎页面中取值
2、会自动转换为需要的类型注入
@Data
@Component //需要用@Component体系注解标识为spring组件放到容器中,@Value才会被扫描、解析
public class SysConfig {
@Value("${id}") //注入普通字段
private int id;
@Value("${user.name}") //注入对象的属性值
private String username;
@Value("${city}") //注入数组
private String[] cityArr;
@Value("${city}") //注入list
private List<String> cityList;
@Value("${city}") //注入set
private Set<String> citySet;
}
3、可以指定默认值,未在yml中配置时会自动使用默认值
@Value("${user.name}") //未使用:指定默认值,如果yml中未配置对应的配置项,应用启动时会直接报错
private String username;
@Value("${user.name:chy}") //使用了:指定默认值,如果yml中未配置对应的配置项,会自动使用默认值。空数组[],空对象{}
private String username;
@Value("${user.name:Steve Jobs}") //:后面不用加一个空格,字符、字符串类型的默认值,不管是否包含空格,都不用加引号。会自动把第一个:后面的内容作为默认值,如果:后面加了空格、引号,也会被当做默认值的一部分
private String username;
@Value("${user.name:}") //加了: 但未指定具体的默认值时,默认值会取对应数据类型的默认值,引用型 => null,String => 空串
private String username;
@Value("${user.birthday:2020-01-01 00:00:00}") //日期时间类型,直接注入Date容易出错,可以注入String类型的日期时间或Long型时间戳,提供个get方法手动转换为Date
private String birthday;
会自动注入与成员变量名同名的配置项
@Data //需要提供setter方法用于注入
@Component //需要用@Component体系注解标注为spring组件,放到容器中
@ConfigurationProperties(prefix = "upload") //value、prefix属性互为别名,都可以指定配置项前缀
public class UploadConfig {
private int maxFileSize;
private String savaDir;
//.....
}
在创建springboot项目时,可以勾选 Developer Tools -> Spring Configuration Processor,或手动添加依赖
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-configuration-processorartifactId>
<optional>trueoptional>
dependency>
这样先使用@ConfigurationProperties编写配置类,在properties、yml中写配置时,对应的配置项会有代码提示
1、@Value、@ConfigurationProperties 都可以和springcloud的热更新注解 @RefreshScope 搭配使用,更新yml中对应的配置项时,自动刷新对应的java字段值。
2、@Value、@ConfigurationProperties 都只能注入到普通的实例成员上,不能注入到 final修饰的成员上,也不能直接注入到 static 修饰的成员变量上,但可以使用实例方法的方式间接注入到static成员变量上
@Configuration
public class UploadConfig {
public static String saveDir; //不能用final修饰,不然注入不了
@Value("${upload.saveDir}") //标注在实例方法上。方法不能用static修饰,否则注入不了
public void setSaveDir(String saveDir) {
UploadConfig.saveDir = saveDir;
}
//.....
}
3、yaml配置项包含连词线写法
4、@Value、@ConfigurationProperties 都只能注入配置文件中的显式配置
eg. 在配置文件中显式配置了 server.port,才能注入 server.port;没在配置文件中显式配置 server.port,虽然springboot有这个配置项、也有默认值,但@Value、@ConfigurationProperties不会注入springboot自动配置指定的默认值。
独立成行的 - - - 用于分割配置,spring.profiles 指定当前配置段的名称
#各环境的公共配置
server:
port: 9000
#指定要使用的配置
spring:
profiles:
active: test
#dev环境配置
---
spring:
profiles: dev
#......
#test环境配置
---
spring:
profiles: test
#......
1、resources下新建配置文件,文件名格式为 application-xxx,示例
2、application.yml中指定要使用的配置文件
#各环境的公共配置
spring:
profiles:
#指定要使用的配置文件,值是application-后面的部分,可以指定多个配置文件,有多个配置文件时逗号分隔
active: dev
application.yml 中可以直接写各环境的公共配置,也可以把公共配置拆分到多个yaml中,然后在application.yml中通过 spring.profiles.include 引入。
active、include 都可以引入指定的配置文件,作用差不多,拆分为2个不同的配置项只是为了语义上的区分,好比html的布局标签