首页 专题 文章 代码 归档
SpringBoot的配置文件
2020.02.09 10:46 2020.02.09 10:46

1. 配置文件

1.1. 配置文件

SpringBoot默认有一个配置文件位于:src/main/resources/application.properties

其实有两个配置文件:

  • application.properties
  • application.yml

这两种配置文件是等效的,只是后缀不一样,所使用的语法也不同。


配置文件的作用:修改SpringBoot自动配置的默认值;

因为很多配置SpringBoot在底层都给我们自动配置好的,我们要修改为自己需要的值,那么就可以在配置文件里面覆盖;

1.1.1. YAML

YAML 是 "YAML Ain't a Markup Language"(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)。

以下摘自菜鸟教程 https://www.runoob.com/w3cnote/yaml-intro.html

1.1.1.1. 基本语法
  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进不允许使用tab,只允许空格
  • 缩进的空格数不重要,只要相同层级的元素左对齐即可
  • '#'表示注释
1.1.1.2. 数据类型
  • 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
  • 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
  • 纯量(scalars):单个的、不可再分的值
1.1.1.3. YAML对象

对象键值对使用冒号结构表示 key:(空格)value,冒号后面要加一个空格

也可以使用 key:{key1: value1, key2: value2, ...}。

1.1.1.4. YAML数组

- 开头的行表示构成一个数组:

- A
- B
- C

YAML 支持多维数组,可以使用行内表示:

key: [value1, value2, ...]

数据结构的子成员是一个数组,则可以在该项下面缩进一个空格。

-
 - A
 - B
 - C

意思是 companies 属性是一个数组,每一个数组元素又是由 id、name、price 三个属性构成。

1.1.1.5. 复合结构

数组和对象可以构成复合结构,例:

languages:
  - Ruby
  - Perl
  - Python 
websites:
  YAML: yaml.org 
  Ruby: ruby-lang.org 
  Python: python.org 
  Perl: use.perl.org

1.2. 两种配置文件比较

properties

server.port=9000
server.error.path=/error

yaml

server:
  port: 9000
  error:
    path: /error

1.3. YAML配置的值的获取

yml文件内容:

person:
  name: hello
  age: 18
  date: 2020/2/10
  aBoolean: false
  map: {"k1":"v1","k2":"v1"}
  list:
    - 1
    - 2
    - 3
    - 4
  dog:
    name: dogg
    age: 8

将配置文件值映射到bean类中:

@Component
@ConfigurationProperties(prefix = "person")
public class Person {

    private Integer age;
    private String name;
    private Boolean aBoolean;
    private Date date;

    private Dog dog;
    private Map<String, Object> map;
    private List<Integer> list;

    // getter and setter..必须要写,此处省略
    @Override
    public String toString() {
        return "Person{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }

}

解释:

必须要加注解:

  • @Component
  • @ConfigurationProperties(prefix = "person")

prefix代表前缀是什么,也即.yml文件中的第一个值。

截图-1581130253

加入依赖:

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-configuration-processor -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <version>2.2.4.RELEASE</version>
</dependency>

加入此依赖,IDEA就有自动提示了,需重新运行以下此项目。

测试:

package com.misiai;

import com.misiai.bean.Person;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class BootApplicationTests {

    @Autowired
    private Person person;

    @Test
    void contextLoads() {
        System.out.println(person.getAge());
    }

}

截图-1581130349

解决中文乱码:

截图-1581130452

1.4. Spring注解方式获取值

@Value注解

package com.misiai.bean;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;
import java.util.Map;

@Component
// @ConfigurationProperties(prefix = "person")
public class Person {

    private Integer age;
    @Value("${person.name}")
    private String name;
    private Boolean aBoolean;
    private Date date;

    private Dog dog;
    private Map<String, Object> map;
    private List<Integer> list;

}

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

@ConfigurationProperties @Value
功能 批量注入配置文件中的属性 一个个指定
松散绑定(松散语法) 支持 不支持
SpEL 不支持 支持
JSR303数据校验 支持 不支持
复杂类型封装 支持 不支持

总结:

配置文件yml还是properties他们都能获取到值;

如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;

如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;

1.5. 指定配置文件

@PropertySource("classpath:person.properties")

@Component
// @ConfigurationProperties(prefix = "person")
@PropertySource("classpath:person.properties")
public class Person {

    private Integer age;
    @Value("${person.name}")
    private String name;
    private Boolean aBoolean;
    private Date date;

    private Dog dog;
    private Map<String, Object> map;
    private List<Integer> list;

}

@ImportResource:导入Spring的配置文件,让配置文件里面的内容生效;

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

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

@ImportResource(locations = {"classpath:beans.xml"})
导入Spring的配置文件让其生效

代码:

@SpringBootApplication
@ImportResource("classpath:beans.xml")
public class BootApplication {

    public static void main(String[] args) {
        SpringApplication.run(BootApplication.class, args);
    }

}

beans.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean class="com.misiai.service.HelloService" id="helloService"/>
</beans>

测试:

@Autowired
ApplicationContext ap;

@Test
void test1() {
    boolean helloService = ap.containsBean("helloService");
    System.out.println("helloService = " + helloService);
}

结果:

截图-1581131640

1.6. 自定义的配置文件

给容器中添加组件的方式:一个配置类

package com.misiai.config;

import com.misiai.service.HelloService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Configuration 代表是一个配置类
 */
@Configuration
public class MyConfig {

    /**
     * @Bean将方法的返回值添加到容器中,默认是组件的方法名
     */
    @Bean
    public HelloService helloService() {
        return new HelloService();
    }
}

1.7. 配置文件占位符

person:
  age: 13
  name: Wudao
  dog:
    name: ${person.name:冒号后面代表默认值} - Dog

官网自带的:

my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.uuid=${random.uuid}
my.number.less.than.ten=${random.int(10)}
my.number.in.range=${random.int[1024,65536]}

2. Profile

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

默认使用application.properties的配置;

#server.port=9000
#server.error.path=/error
#person.dog.name=无道
#person.dog.age=12
server.port=1200

激活:

1、激活:在application.properties

spring.profiles.active=dev

server.port=9000
#server.error.path=/error
#person.dog.name=无道
#person.dog.age=12
spring.profiles.active=dev

2、命令行

java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;

3、虚拟机参数

-Dspring.profiles.active=dev

yml支持多文档块方式

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

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


---

server:
  port: 8084
spring:
  profiles: prod  #指定属于哪个环境

3. 配置文件杂类

官网文档:https://docs.spring.io/spring-boot/docs/2.2.0.RELEASE/reference/htmlsingle/#boot-features-external-config-command-line-args

配置文件存放于类路径config文件夹

  • file: ./config
  • file:/
  • classpath:config
  • classpath:/

优先级高->低,会覆盖;形成互补配置。

项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定配置文件和默认加载的这些配置文件共同起作用形成互补配置;


外部配置加载顺序

1.命令行参数

所有的配置都可以在命令行上进行指定; 多个配置用空格分开; --配置项=值   java -jar spring-boot-02-config-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.*属性值

6.jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件

7.jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件

8.jar包外部的application.properties或application.yml(不带spring.profile)配置文件

9.jar包内部的application.properties或application.yml(不带spring.profile)配置文件

10.@Configuration注解类上的@PropertySource

11.通过SpringApplication.setDefaultProperties指定的默认属性

本节阅读完毕! (分享
二维码图片 扫描关注我们哟