SpringBoot系列五:配置文件

 SpringBoot使用一个全局的配置文件,配置文件名是固定的;application.propertiesapplication.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 lists;
    private Dog dog;
}
 
  

注意:导入配置文件处理器,在配置文件中配置绑定就会有提示。


    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 lists;
    private Dog dog;
}
 
  

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获取值比较。
SpringBoot系列五:配置文件_第1张图片
(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 lists;
    private Dog dog;
}
 
  

抛异常BindException:
SpringBoot系列五:配置文件_第2张图片
@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 lists;
    private Dog dog;
}
 
  

控制台正常输出:

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 lists;
    private Dog dog;
}
 
  

控制台输出:

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);
    }

}

控制台输出:true

五、@Bean
 @Configuration:指明当前类是一个配置类;就是来替代之前的Spring配置文件。
 在Spring采取在配置文件中使用标签添加组件,SpringBoot推荐使用注解@Bean将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名。

@Configuration
public class MyAppConfig {

    @Bean
    public HelloService helloService(){
        System.out.println("配置类@Bean给容器中添加组件了...");
        return new HelloService();
    }
}

SpringBoot系列五:配置文件_第3张图片
六、配置文件占位符
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

在这里插入图片描述
yml支持多文档块方式:

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

你可能感兴趣的:(SpringBoot)