了解SpringBoot的配置文件

Spring Boot的配置(配置文件,加载顺序,配置原理)之配置文件

配置文件

Spring Boot使用一个全局配置文件,配置文件名是固定的

  • application.properties
  • application.yml

配置文件的作用:修改Spring Boot自动配置的默认值,即修改Spring Boot在底层都给我们配置好的值

YAML(YAML Ain't Markup Language)

标记语言:

以前的配置文件;大多都使用的是xxx.xml文件;

YAML:以数据为中心,比json、xml更适合做配置文件

YAML配置例子(冒号后面一定要加空格)

server:
  port: 8081

XML:配置例子

<server>
	<port>8081</port>
</server>

1.YAML的语法

1.基本语法

属性与值的关系: k:(空格)v : 表示一对键值对(空格不能省略);

空格的缩进来控制层级关系:只要是左对齐的数据都是都同一个层级的

server:
   port: 8081
   path: /hello

属性和值也是大小写敏感的;

2.值的写法

字面量:普通的值(数字,字符串,布尔)

k: v 字面直接来写;

一般字符串不用加上单引号或者双引号;

“双引号”:会转义字符串里面的特殊字符,特殊字符会作为本身想标识的意思

name: "zhangsan /n list"
输出:zhangsan 换行 list

‘单引号’:不会转义特殊字符,特殊字符最终只是一个普通的字符串数据

name: 'zhangsan /n list'
输出:zhangsan /n list

对象、Map(属性和值)(键值对):

k: v 在下一行来写对象的属性和值的关系;注意使用空格缩进

friends:
  lastName: zhangsan
  age: 20

行内写法:

friends: {lastName: zhangsan,age: 18}

数组(List、Set):

用 -(空格)值 表示数组中的一个元素

pets:
 - cat
 - dog
 - pig

行内写法

pets: {cat,dog,pig}

3.配置文件值注入

1.@ConfigurationProperties(默认从全局配置文件中取值)

配置文件

server:
  port: 8081

person:
  lastName: zhangsan
  age: 19
  boss: false
  birth: 2020/5/20
  maps: {k1: v1,k2: 12}
  lists:
    - lisi
    - zhaoliu
  dog:
    name: 旺财
    age: 2

javaBean

/**
 * 将配置文件中配置的每一个属性的值,映射到这个组件中
 *  @ConfigurationProperties:告诉springBoot将本类中的所有属性和配置文件相关的配置进行绑定;
 *          prefix = "person":配置文件中哪个下面的所有属性进行一一映射
 *          只有这个组件是容器中的组件,才能使用容器提供的功能;
 **/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {

    private String lastName;
    private Integer age;
    private Boolean boss;
    private Date birth;

    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;

导入配置文件处理器,配置文件进行绑定就会有提示(配置中的提示满足驼峰命名法的切换lastName=last-name)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

2.@Value

/**
     *  Spring底层的Value,之前是在Spring配置文件中
     *  <bean>
     *      <property name="lastName" value="字面量 / ${key}-从环境变量、配置文件中获取值 / #{spel}"><property/>
     *  </bean>
     *  以前支持的,在@Value中都支持
     **/

    @Value("${person.last-name}")
    private String lastName;
    @Value("#{11*2}")
    private Integer age;
    @Value("true")
    private Boolean boss;

3.@Value获取值和@ConfigurationProperties获取值比较

@ConfigutationProperties

@Value

批量注入

支持

不支持

松散绑定(松散语法:lastName=last_name=last-name)

支持

不支持

SpEL

不支持

支持

JSR303数据校验

支持

不支持

复杂类型封装(对象、map)

支持

不支持

配置文件无论是ymal还是properties他们都能获取到值

总结

如果说只是在某个业务逻辑(Controller、Service)中获取一下配置文件中的某项值,使用@Value

如果说我们专门编写了一个javabean来和配置文件进行映射,则使用@ConfigurationProperties

4.配置文件注入值数据校验

@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
    
    @Email
    private String lastName;

5.@PropertySource&ImportResource

  • @PropertySource:加载指定的配置文件(如果全局配置文件中有符合的前缀属性会先加载全局文件,就不会再去寻找PropertySource标注的文件)
@PropertySource("classpath:person.properties")
@Component
@ConfigurationProperties(prefix = "person")
  • @ImportResource:导入Spring的配置文件,让配置文件里面的内容生效;

Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;

想让Spring的配置文件生效,加载进来;@ImportResource标注在一个配置类上

@ImportResource(locations = {"classpath:beans.xml"})
导入Spring的配置文件让其生效
  • Spring Boot中推荐的添加组件的方式
    1.不编写xml文件,使用全注解的方式(配置类==》配置文件)
    2.使用@Bean注解来给容器中添加组件
/**
 * 指明当前类为配置类
 * 在配置文件中用bean来添加组件
 * 配置类中用@Bean
 **/
@Configuration
public class MyAppConfig {

    //将方法的返回值添加到容器中:容器中这个组件默认的id就是方法名
    @Bean
    public HelloService helloService(){
        System.out.println("@Bean给容器添加组建了");
        return new HelloService();
    }
}

4.配置文件占位符

1.随机数

${random.value}、${random.int}、${random.long}
${random.int(10)}、${random.int[1024,65536]}

2.占位符获取之前配置的值,如果没有可以使用: 指定默认值

可以在配置文件中引用前面配置过的属性(优先级前面配置过的这里都能用),找不到属性时使用${key: value}来指定默认值

person.last-name=张三${random.uuid}
person.age=${random.int}
person.birth=2017/12/15
person.boss=false
person.dog.name=${person.hello: hello}_dog
person.dog.age=2
person.maps.k1=v1
person.maps.k2=15
person.lists=1,2,b

5.Profile

1.多Profile文件

我们在主配置文件编写的时候,文件名可以是application-{profile}.properties/yml

默认使用application.properties;

2.yml支持多文档块方式

三个 - 可以分出分档块

profiles: 指定属于哪个环境(自定义),active:激活哪个环境

server:
  port: 8081
spring:
  profiles:
    active: prod

---
server:
  port: 8082
spring:
  profiles: prod
---
server:
  port: 8083
spring:
  profiles: dev
---

3.激活指定profile

1.在默认全局配置文件中 spring.profiles.active=dev 激活

2.命令行的方式激活:

  • cmd在jar包目录下 : java -jar xxx.jar --spring.profies.active=dev
  • IDEA运行配置的program arguments(程序参数输入): --spring.profies.active=dev
  • IDEA运行配置的VM options(虚拟机选项):-Dspring.profiles.active=dev