SpringBoot默认可使用两种形式的全局配置文件
application.properties
application.yml
配置文件用于修改SpringBoot的默认配置,配置文件放在src/main/resources目录或者类路径/config下。
.yml是YAML语言的文件,以数据为中心,比json、xml更适合做配置文件
YAML语法:
1、YAML基本语法
使用缩进表示层级关系
缩进时不允许使用TAB键,只允许使用空格键
缩进的空格数不重要,只要相同层级的元素左对齐即可
大小写敏感
2、YAML支持的三种数据结构
对象:键值对的集合(属性和值,也就是键值对)
k: v :在下一行写对象的属性和值的关系
friends:
lastName: zhangsan
age: 20
也可以采用行内写法:
friends: {lastName: zhangsan,age: 20}
数组:一组按次序排列的值(List、Set)
用-表示集合中的一个元素
pets:
-cat
-dog
-pig
行内写法:
pets: [cat,dog,pig]
字面值:单个的、不可再分的值(数字,字符串,布尔值)
k: v :字面值直接写
字符串默认不用加上单引号或双引号
“”:双引号,不会转义字符串里面的特殊字符,特殊字符会作为本身想表达的意思
name: ‘zhangsan \n lisi’,输出zhangsan 换行 lisi
‘’:单引号,会转义特殊字符,特殊字符只是一个普通的字符串
name: ‘zhangsan \n lisi’ ,输出zhangsan \n lisi
server:
port: 8081
context-path: /test //指定项目访问路径
在配置文件中定义类属性,可以直接注入到POJO的类中
如配置文件中定义
Person:
name: zhangsan
age: 20
birth: 2001/12/12
maps:
- k1: v1
- k2: v2
lists:
- list1
- list2
dog:
name: hapi
age: 1
对应的POJO为Person,必须是一个受Spring容器管理的bean
@Component
@ConfigurationProperties(prefix = "Person")//该注解表明绑定配置文件中的配置,且前缀是Person
public class Person {
private String name;
private int age;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
....省略get,set方法
}
<!--用于在配置文件中出现提示 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
properties配置文件配置方式,但是IDEA默认properties使用的编码是utf-8,需要在运行时换位ACSII码。
除了使用@ConfigurationProperties从配置文件中获取值之外,还可以使用@Value注解,@Value支持SPEL表达式,不支持支持JSR303校验,不支持复杂的封装,如List、Set。
@Component
//@ConfigurationProperties(prefix = "Person")
public class Person {
@Value("${Person.name}")
private String name;
@Value("#{1 * 10}")
private int age;
}
配置文件yml和properties都能获取到值
如果说,我们只是在某个业务逻辑中需要获取配置文件中的某项值,使用@Value
如果编写了专门的javaBean来和配置文件进行映射,则应该使用@ConfigurationProperties
@ConfigurationProperties与@PropertySource(只能用于properties文件)结合读取指定文件
@ConfigurationProperties默认从全局配置文件中获取
@PropertySource指定加载的配置文件,改变从默认的全局配置文件中读取数据
@PropertySource(value = {"classpath:person.propeties"})
@Component
@ConfigurationProperties(prefix = "Person")
public class Person {
@Value("${Person.name}")
private String name;
@Value("#{1 * 10}")
private int age;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
//省略get,set方法
}
@ImportResource读取外部配置文件
导入自己编写的Spring的配置文件,让配置文件中的内容生效,SpringBoot里面没有Spring的配置文件,自己编写的配置文件,默认无法识别,如果想让其生效,则使用@ImportResource注解标注在启动类上即可
@ImportResource(locations = {"classpath:自定义Spring配置文件"})
@SpringBootApplication
public class HelloWorld {
public static void main(String[] args) {
SpringApplication.run(HelloWorld.class,args);
}
}
但是一般不采用上面的方式,推荐使用下面这种注解的方式,定义一个配置类,在配置类中编写bean的注入,这样在启动SpringBoot的时候会自动扫描该配置类,并将编写的Bean自动添加到Spring容器中。
/**
* @Configuration指明当前类是一个配置类,用来代替Spring的xml形式
*/
@Configuration
public class MyConfigure {
// @Bean注解将方法的返回值添加到容器中,容器中这个Bean的默认Id就是方法名
@Bean
public HelloService helloService(){
return new HelloService();
}
}
在配置文件中可以使用随机数,如
r
a
n
d
o
m
.
v
a
l
u
e
、
{random.value}、
random.value、{random.int}、
r
a
n
d
o
m
.
l
o
n
g
、
{random.long}、
random.long、{random.uuid}。
在配置文件中使用占位符,可以在配置文件中引用前面配置过的属性
Person:
name: zhangsan${random.uuid}
age: 20
birth: 2001/12/12
maps:
- k1: v1
- k2: v2
lists:
- list1
- list2
dog:
name: ${Person.name:hello}_hapi
age: 1
${Person.name:默认值}来指定找不到属性时的默认值。
Profile
是Spring对不同环境提供不同配置功能的支持,可以通过激活、指定参数等方式快速切换环境。
1、多profile文件形式,默认使用application.properties/yml
格式:application-{profile}.properties/yml
application-dev.properties/yml、application-pro.properties/yml
2、多profile文档模块,使用yml语法可以用—来分模块,将多个文件合并到一个文件中,第一个为默认的文档块,当没有指定 spring.profiles.active的属性的时候,则默认加载第一个文档块的内容。
server:
port: 8081
spring:
profiles:
active: dev
Person:
name: zhangsan${random.uuid}
age: 20
birth: 2001/12/12
maps:
- k1: v1
- k2: v2
lists:
- list1
- list2
dog:
name: ${Person.name:hello}_hapi
age: 1
---
server:
port: 8082
spring:
profiles: dev
---
server:
port: 8083
spring:
profiles: pro
3、激活方式:
命令行 : --spring.profiles.active=dev
配置文件: spring.profiles.active=dev
jvm参数: -Dspring.profiles.active=dev
配置文件加载位置
SpringBoot启动会扫描一下位置的application.properties或者application.yml文件作为SpringBoot的默认配置文件
file:./config/(当前项目的根目录下的config目录下)
file:./(当前项目的根目录下)
classpath:/config/
classpath:/
以上是按照优先级从高到低的顺序,所有位置的文件都会被加载,高优先级配置内容会覆盖低优先级配置内容
也可以通过配置spring.config.location来改变默认配置,一般用于运维时,比如项目打包之后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置,指定配置文件和默认加载的配置文件会一起起作用。
java -jar 打包的jar包 --spring.config.location=配置文件位置。
外部配置加载顺序
SpringBoot支持多种外部配置方式,及可以从以下位置加载配置,下面是优先级从高到低列出的,高优先级会覆盖低优先级的配置,所有的配置会想成互补配置。
优先加载带profile的,再来加载不带profile的,都是有jar包外向jar包内进行寻找。
配置文件和jar包放在同级目录下,会优先加载外面的配置文件