配置文件
SpringBoot使用一个全局的配置文件,配置文件名是固定的;
•application.properties
•application.yml
配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;
YAML文件语法
基本语法
k:(空格)v
:表示一对键值对(空格必须有);- 以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的。
- 属性和值大小写敏感;
- 不支持 tab 缩进
- 可以使用
-小写字母
或_小写字母
来 代替大写字母
, 如userName
与user-name
,user_name
含义是一样的 key: value
格式书写。key 后面跟着冒号, 再后面跟着一个空格, 然后是值。值的写法
普通的值(数字,字符串,布尔)
- 对象、Map (属性和值) (键值对)
- 数组 (List、Set)
字面量:普通的值(数字,字符串,布尔)
直接就是 key: value , 如:
age: 18
name: mysgk
注意:
- 字符串默认不用加上单引号或者双引号;
" "
:双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思。name: "zhangsan \n lisi"
表示为:zhangsan 换行 lisi
' '
:单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据。name: 'zhangsan \n lisi'
表示为:zhangsan \n lisi
对象、Map(属性和值)(键值对)
对象还是 k: v
的方式k: v
:在下一行来写对象的属性和值的关系;注意缩进 (不支持 tab, 使用空格), 如:
person:
age: 18
name: zhangshan
行内写法:
person: {age: 18,name: zhangshan}
数组(List、Set)
用 -
值表示数组中的一个元素, 如:
animals:
- cat
- dog
- pig
行内写法:
animals: [cat,dog,pig]
读取配置文件(配置文件的注入)
person:
lastName: hello
age: 18
boss: false
birth: 2017/12/12
maps: {k1: v1,k2: 12}
lists:
‐ lisi
‐ zhaoliu
dog:
name: 小狗
age: 12
使用@Value注解
@Componnet
class ReadValueOfYml{
@Value("${userproperties.name}")
private String name;
@Value("${userproperties.age}")
private String age;
@Value("${userproperties.sex}")
private String sex;
@Value("${userproperties.email}")
private String email;
@Value("${useryml.name}")
private String nameyml;
@Value("${useryml.age}")
private String ageyml;
@Value("${useryml.sex}")
private String sexyml;
@Value("${useryml.email}")
private String emailyml;
@Test
public void testValue(){
System.out.println("name=" + name + ",age=" + age + ",sex="
+ sex + ",email" + email);
System.out.println("nameyml=" + nameyml + ",ageyml=" + ageyml
+ ",sexyml=" + sexyml + ",emailyml" + emailyml);
}
}
使用@ConfigurationProperties注解
useryml:
name: gongjie
age: 23
sex: 1
email: 111@163.com
/**
* 将配置文件中配置的每一个属性的值,映射到这个组件中
* @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
* prefix = "person":配置文件中哪个下面的所有属性进行一一映射
*
* 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;
**/
@Component
@ConfigurationProperties(prefix = "userproperties")
public class ReadPropertiesValue {
private String name;
private String age;
private String email;
private String sex;
@Override
public String toString() {
return "ReadPropertiesValue{" +
"name='" + name + '\'' +
", age=" + age +
", email='" + email + '\'' +
", sex=" + sex +
'}';
}
public void setName(String name) {
this.name = name;
}
public void setAge(String age) {
this.age = age;
}
public void setEmail(String email) {
this.email = email;
}
public void setSex(String sex) {
this.sex = sex;
}
}
注意:ReadPropertiesValue
类上如果不是一个组件,则在容器无法获取。需要在启动类上加@EnableConfigurationProperties(ReadPropertiesValue.class)
将其注册到容器中。
@Value获取值和@ConfifigurationProperties获取值比较
如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用 @Value
;
如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用 @ConfifigurationProperties
;
使用Environment
注意:这种方式是直接依赖注入Evnironment
对象,然后使用environment.getProperty("键名")
即可读取对应的值。’
@Autowired
Environment environment;
@Test
public void environmentTest(){
System.out.println(environment.getProperty("userproperties.name")
+ "==" + environment.getProperty("userproperties.age") + "==" +
environment.getProperty("userproperties.sex") + "==" +
environment.getProperty("userproperties.email"));
System.out.println(environment.getProperty("useryml.name") + "=="
+ environment.getProperty("useryml.age") + "==" +
environment.getProperty("useryml.sex") + "==" +
environment.getProperty("useryml.email"));
}
读取自定义配置文件
@PropertySource:加载指定的配置文件
@Component
@PropertySource(value = "classpath:configValue.yml")
public class ReadYmlByValue {
@Value("${userconfigvalueyml.name}")
public String name;
@Value("${userconfigvalueyml.age}")
public String age;
@Value("${userconfigvalueyml.sex}")
public String sex;
@Value("${userconfigvalueyml.email}")
public String email;
@Override
public String toString() {
return "ReadYmlByValue{" +
" + name + '\'' +
", age='" + age + '\'' +
", sex='" + sex + '\'' +
", email='" + email + '\'' +
'}';
}
}
@ImportResource:导入Spring的配置文件,让配置文件里面的内容生效
Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;
想让Spring的配置文件生效,加载进来;@ImportResource标注在一个配置类上.
@ImportResource(locations = {"classpath:beans.xml"}) // 导入Spring的配置文件让其生效
配置文件占位符
随机数
${random.value}、${random.int}、${random.long} ${random.int(10)}、${random.int[1024,65536]}
占位符获取之前配置的值,如果没有可以是用 :指定默认值
person.last‐name=张三${random.uuid}
person.age=${random.int}
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
person.dog.name=${person.hello:hello}_dog
person.dog.age=15
Profifile
多Profifile文件
我们在主配置文件编写的时候,文件名可以是 application-{profifile}.properties/yml
默认使用application.properties的配置;
yml支持多文档块方式
server:
port: 8081
spring:
profiles:
active: prod # 指顶当前环境是prod
‐‐‐
server:
port: 8083
spring:
profiles: dev #指定属于哪个环境
‐‐‐
server:
port: 8084
spring:
profiles: prod #指定属于哪个环境
激活指定profifile
1、在配置文件中指定 spring.profifiles.active=dev
2、命令行: java -jar spring-boot-02-confifig-0.0.1-SNAPSHOT.jar --spring.profifiles.active=dev;
可以直接在测试的时候,配置传入命令行参数
3、虚拟机参数; -Dspring.profifiles.active=dev
配置文件加载位置
springboot 启动会扫描以下位置的 application.properties
或者 application.yml
文件作为Spring boot的默认配置文件。
–file:./config/
–file:./
–classpath:/config/
–classpath:/
优先级由高到底,高优先级的配置会覆盖低优先级的配置;
SpringBoot会从这四个位置全部加载主配置文件;互补配置;
我们还可以通过 spring.confifig.location
来改变默认的配置文件位置
项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定配置文件和默 认加载的这些配置文件共同起作用形成互补配置; java -jar spring-boot-02-confifig-02-0.0.1-SNAPSHOT.jar
--spring.confifig.location=G:/application.properties
外部配置加载顺序
SpringBoot也可以从以下位置加载配置; 优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会 形成互补配置
1.命令行参数
所有的配置都可以在命令行上进行指定 java -jar spring-boot-02-confifig-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc
多个配置用空格分开; —配置项=值
2.来自java:comp/env的JNDI属性
3.Java系统属性(System.getProperties())
4.操作系统环境变量
5.RandomValuePropertySource配置的random.属性值
由jar包外向jar包内进行寻找;
优先加载带profile
6.jar包外部的application-{profifile}.properties或application.yml(带spring.profifile)配置文件
7.jar包内部的application-{profifile}.properties或application.yml(带spring.profifile)配置文件
再来加载不带profifile
8.jar包外部的application.properties或application.yml(不带spring.profifile)配置文件
*9.jar包内部的application.properties或application.yml(不带spring.profifile)配置文件
10.@Confifiguration注解类上的@PropertySource
11.通过SpringApplication.setDefaultProperties指定的默认属性
所有支持的配置加载来源;