SpringBoot使用一个全局的配置文件,配置文件名是固定的;application.properties
和 application.yml
。配制文件的作用是用来修改SpringBoot自动配置的默认值;配置文件放在 src/main/resources
目录或者 类路径/config
下。
一、yaml
YAML(YAML Ain’t Markup Language),以数据为中心,比json、xml等更适合做配置文件。
1、YAML基本语法
k:(空格)v:表示一对键值对(空格必须有)。
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的。
server:
port: 8081
path: /hello
属性和值也是大小写敏感的。
2、YAML支持的三种数据结构
字面量:普通的值(数字、字符串、布尔)
k:v
:字面直接来写;字符串默认不用加上单引号或者双引号。
""
:双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思。
name:"zhangsan \n lisi"
输出:zhangsan \n lisi
''
:单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据,
name:'zhangsan \n lisi'
输出:zhangsan 换行 lisi
对象:Map(属性和值)(键值对)
k:v
:在下一行来写对象的属性和值的关系;注意缩进,对象还是k、v的方式。
friends:
lastName: zhangsan
age: 20
行内写法: friends: {lastName: zhangsan,age: 20}
数组:(List、Set)
用-值来表示数组中的一个元素。
pets:
- cat
- dog
- pig
行内写法:pets: [cat,dog,pig]
3、yaml使用
(1)、yml配置文件。
person:
last-name: zhangsan
age: 18
boss: false
birth: 2017/12/15
maps: {k1: v1,k2: 12}
lists:
- lisi
- zhaoliu
dog:
name: 小狗
age: 2
(2)、创建 Person 类,将配置文件中配置的每一个属性的值,映射到这个组件中。@ConfigurationProperties:告诉SpringBoot将本类中的所有的属性和配置文件中相关的配置进行绑定,prefix = "person"
:配置文件中哪个下面的所有属性进行映射。只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能。
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map maps;
private List
注意:导入配置文件处理器,在配置文件中配置绑定就会有提示。
org.springframework.boot
spring-boot-configuration-processor
(3)、测试:SpringBoot单元测试; 可以在测试期间很方便的类似编码一样进行自动注入等容器的功能。
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBoot02ConfigApplicationTests {
@Autowired
Person person;
@Test
public void contextLoads() {
System.out.println(person);
}
}
控制台输出:
Person{lastName='zhangsan', age=18, boss=false, birth=Fri Dec 15 00:00:00 CST 2017, maps={k1=v1, k2=12}, lists=[lisi, zhaoliu], dog=Dog{name='小狗', age=12}}
二、properties
1、properties配置文件。
person.lastName=张三
person.age=18
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
person.dog.name=dog
person.dog.age=15
2、修改 Person 使用 @Value 获取值。
@Component
public class Person {
@Value("${person.lastName}")
private String lastName;
@Value("#{11*2}")
private Integer age;
@Value("true")
private Boolean boss;
@Value("${person.birth}")
private Date birth;
private Map maps;
private List
3、运行测试类 SpringBoot02ConfigApplicationTests 中的测试方法。控制台输出:
Person{lastName='张三', age=22, boss=true, birth=Fri Dec 15 00:00:00 CST 2017, maps=null, lists=null, dog=null}
4、@Value获取值和@ConfigurationProperties获取值比较。
(1)、无论yml还是properties他们都能获取到值。如果我们只需要获取配置文件中的某项值,使用 @Value;如果我们需要javaBean来和配置文件进行映射,我们就直接使 @ConfigurationProperties。
(2)、@ConfigurationProperties 支持松散绑定,我们可以在配置文件中将 person.lastName
写成 person.last-name
或者 person.last_name
都是可以获取到值的。@Value 不支持松散绑定,若配置文件中是 person.lastName
就必须使用 @Value("${person.lastName}")
,但是如果person.lastName
中的lastName刚好是person的一个属性的名字,也可以使用@Value("${person.last_name}")
获取值,否则就会抛异常。
(3)、@ConfigurationProperties 不支持SpEL,我们在配置文件中使用SpEL: person.age=#{11*2}
,就会抛异常。而 @Value 支持SpEL,我们使用 @Value("${person.age}")
可以正常获取到age的值。
(4)、@ConfigurationProperties 支持 @Validated 校验。
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
@Email
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map maps;
private List
抛异常BindException:
@Value 不支持@Validated 校验。
@Component
@Validated
public class Person {
@Value("${person.lastname}")
@Email
private String lastName;
@Value("${person.age}")
private Integer age;
@Value("true")
private Boolean boss;
@Value("${person.birth}")
private Date birth;
private Map maps;
private List
控制台正常输出:
Person{lastName='张三', age=22, boss=true, birth=Fri Dec 15 00:00:00 CST 2017, maps=null, lists=null, dog=null}
(5)、@ConfigurationProperties 支持复杂类型封装
Person{lastName='zhangsan', age=18, boss=false, birth=Fri Dec 15 00:00:00 CST 2017, maps={k1=v1, k2=12}, lists=[lisi, zhaoliu], dog=Dog{name='小狗', age=12}}
@Value 不支持复杂类型封装,只能获取基本类型的数据。使用 @Value("${person.maps}")
获取复杂类型 maps 的值会抛异常。
三、@PropertySource
@ConfigurationProperties(prefix = “person”)默认从全局配置文件中获取值。
@PropertySource:从指定的配置文件中获取值。
1、person.properties 配置文件
person.last-name=李四
person.age=18
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=12
person.lists=lisi,zhaoliu
person.dog.name=小狗
person.dog.age=12
2、使用 @PropertySource 从 person.properties 配置文件中获取值
@PropertySource(value = {"classpath:person.properties"})
@Component
public class Person {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map maps;
private List
控制台输出:
Person{lastName='李四', age=18, boss=false, birth=Fri Dec 15 00:00:00 CST 2017, maps={k1=v1, k2=12}, lists=[lisi, zhaoliu], dog=Dog{name='小狗', age=12}}
四、@ImportResource
@ImportResource:导入Spring的配置文件,让配置文件里面的内容生效。SpringBoot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别,想让Spring的配置文件生效,需使用@ImportResource标注在一个配置类上。
1、beans.xml 配置文件
2、在主配置类上使用@ImportResource导入Spring的配置文件beans.xml,让配置文件里面的内容生效。
@ImportResource(locations = {"classpath:beans.xml"})
@SpringBootApplication
public class SpringBoot02ConfigApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBoot02ConfigApplication.class, args);
}
}
3、测试:
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBoot02ConfigApplicationTests {
@Autowired
ApplicationContext ioc;
@Test
public void testHelloService(){
Boolean b = ioc.containsBean("helloService");
System.out.println(b);
}
}
五、@Bean
@Configuration:指明当前类是一个配置类;就是来替代之前的Spring配置文件。
在Spring采取在配置文件中使用
标签添加组件,SpringBoot推荐使用注解@Bean将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名。
@Configuration
public class MyAppConfig {
@Bean
public HelloService helloService(){
System.out.println("配置类@Bean给容器中添加组件了...");
return new HelloService();
}
}
六、配置文件占位符
1、随机数
${random.value}
、${random.int}
、${random.long}
、${random.int(10)}
、${random.int[1024,65536]}
2、使用占位符获取之前配置的值,如果没有可以使用:(冒号)指定默认值。
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
3、运行测试类 SpringBoot02ConfigApplicationTests 中的测试方法。控制台输出:
Person{lastName='张三d940fc05-2067-40c5-bb20-638dc3ed0443', age=-406810709, boss=false, birth=Fri Dec 15 00:00:00 CST 2017, maps={k1=v1, k2=14}, lists=[a, b, c], dog=Dog{name='hello_dog', age=15}}
七、Profile
主配置文件的名称可以是application-${profile}.properties/yml,默认使用application.properties/yml的配置。当SpringBoot项目中同时存在application.properties和application.yml文件时,两个文件都有效,但是application.properties的优先级会比application.yml高。
1、application.properties
server.port=8081
spring.profiles.active=dev
2、application-dev.properties
server.port=8082
3、application-prod.properties
server.port=8083
server:
port: 8081
spring:
profiles:
active: prod
---
server:
port: 8083
spring:
profiles: dev
---
server:
port: 8084
spring:
profiles: prod
激活指定profile:
1、在配置文件中指定spring.profiles.active=dev
2、命令行:
java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev
可以直接在启动的时候,传入命令行参数:–spring.profiles.active=dev
3、虚拟机参数:-Dspring.profiles.active=dev