SpringBoot基础(二):配置文件详解

SpringBoot基础系列文章

SpringBoot基础(一):快速入门

SpringBoot基础(二):配置文件详解


目录

一、配置文件分类

SpringBoot提供了3种配置文件的格式

  • application.properties(传统格式/默认格式)
xml 复制代码
server.port=81
  • application.yml(主流格式)
yml 复制代码
server:
  port: 82
  • application.yaml
yml 复制代码
server:
  port: 83

yml格式和yaml格式除了文件名后缀不一样,格式完全一样

二、配置文件优先级

1、不同版本优先级

  • springboot 2.4.0及以后版本:application.yaml ➡️ application.yml ➡️ application.properties
  • springboot 2.4.0以前版本:application.properties ➡️ application.yml ➡️ application.yaml
  • 旧版application.properties优先级最高,新版优先级最低
  • 不同配置文件中相同配置高优先级覆盖低优先级,不同配置文件中不同配置全部保留

2、不同位置优先级

  • classpath:application.yml(resources目录)【最低-程序员】
  • classpath:config/application.yml(resources目录下的config目录)【项目经理】
  • file :application.yml(jar包所在目录)【运维】
  • file :config/application.yml(jar包所在目录下config目录)【最高-运维经理】

三、配置文件格式

1、yml和yaml格式

  • 大小写敏感
  • 使用缩进表示层级关系,只允许使用空格(不允许使用Tab键)
    • 缩进的空格数量不重要,只要相同层级的元素左侧对齐即可
    • 属性名与属性值之间使用冒号+空格作为分隔
  • #号 表示注释
  • 可使用-代替驼峰,如Java中的lastName,在yml中lastName或last-name都可正确映射

1.1、字符串

  • 字符串可不用加单引号或双引号
  • 单引号不会转义【\n 则为普通字符串显示】
  • 双引号会转义【\n会显示为换行符】
  • 字符串可以拆成多行,换行符会被转化成一个空格
  • |开头,大文本写在下层,保留文本格式,换行符正确显示
yml 复制代码
str1: 哈喽
str2: 哈喽 
 你好
    呀
str3: '哈喽 \n 你好'
str4: "哈喽 \n 你好"
str5: |
 哈喽
  你好

# 转为json样式如下
{"str1":"哈喽","str2":"哈喽 你好 呀","str3":"哈喽 \\n 你好","str4":"哈喽 \n 你好","str5":"哈喽\n 你好"}

1.2、布尔类型

  • trueyeson皆为真,不区分每个字母大小写
  • falsenooff皆为假,不区分每个字母大小写
yml 复制代码
flag1: true
flag2: False
flag3: yes
flag4: NO
# 转为json样式如下
{"flag1":true,"flag2":false,"flag3":true,"flag4":false}
  • 如果出现大写字母会提示异常,不过不影响

1.3、整数型

  • 支持二进制、八进制、十六进制
yml 复制代码
num1: 666
num2: 0001_0000 # 支持二进制、八进制、十六进制
 
# 转为json样式如下
{"num1":666,"num2":4096}

1.4、浮点型

  • 支持科学计数法
yml 复制代码
f1: 1.1
f2: 1.1e-2 # 使用科学计数法
 
# 转为json样式如下
{"f1":1.1,"f2":0.011}

1.5、空(Null)

  • nullNull~都是空,不指定值默认也是空
yml 复制代码
str6: null
str7: Null
str8: ~
str9:
 
# 转为json样式如下
{"str6":"","str7":"","str8":"","str9":""}

1.6、时间类型

  • java.util.Date类型
yml 复制代码
#  date1: 2020-05-26 这样写会抛异常
date1: 2020/05/26
date2: 2020/05/26 01:00:00

# 转为json样式如下
{"date1":1590422400000,"date3":1590426000000}

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

  • java对象对应的yml设置属性
yml 复制代码
person:
  name: 张三
  age: 30
  # Map格式方式一
  map1:
    k1: v1
    k2: v2
  # Map格式方式二
  map2: { key1: value1, key2: value2 }

# 转为json样式如下
{"age":30,"map1":{"k1":"v1","k2":"v2"},"map2":{"key1":"value1","key2":"value2"},"name":"张三"}

1.8、数组、list、set

yml 复制代码
person:
  #数组格式一
  subject:
    - Java
    - 前端
    - 大数据

  #数组格式二
  likes: [王者荣耀,刺激战场]

# 转为json样式如下
{"likes":["王者荣耀","刺激战场"],"subject":["Java","前端","大数据"]}

1.9、对象数组、对象list、对象set

yml 复制代码
person:
  # 对象数组格式一
  pet1:
   - type: dog
     age: 1
   - type: cat
     age: 2
  # 对象数组格式一
  pet2:
   - type: dog
     age: 1
   -
     type: cat
     age: 2
  # 对象数组格式一
  pet3: [{type: dog, age: 1}, {type: cat, age: 2}]

# 转为json样式如下
{
  "pet1":[{"age":1,"type":"dog"},{"age":2,"type":"cat"}],
  "pet2":[{"age":1,"type":"dog"},{"age":2,"type":"cat"}],
  "pet3":[{"age":1,"type":"dog"},{"age":2,"type":"cat"}]
}

2、properties格式

yml 复制代码
person.name=李四
person.age=18
person.flag1=false
person.date1=2019/01/01


# map格式一
person.map1.key1=value1
person.map1.key2=value2
# map格式二
person.map2[k1]=v1
person.map2[k2]=v2


# 数组格式一
person.subject[0]=java
person.subject[1]=python
person.subject[2]=c++
# 数组格式二
person.likes=唱,跳,rap


# 数组对象格式
person.pet1[0].type=cat
person.pet1[0].age=1
person.pet1[1].type=dog
person.pet1[1].age=2

# 转为json样式如下
{
    "age":18,
    "date1":1546272000000,
    "flag1":false,
    "likes":["唱","跳","rap"],
    "map1":{"key1":"value1","key2":"value2"},
    "map2":{"k1":"v1","k2":"v2"},
    "name":"李四",
    "pet1":[{"age":1,"type":"cat"},{"age":2,"type":"dog"}],
    "subject":["java","python","c++"]
}

四、临时属性设置

1、临时属性

  • 临时属性添加方式:java -jar 工程名.jar --属性名=值
  • 多个临时属性之间使用空格分隔
java 复制代码
java --jar springboot.jar --server.port=80 --logging.level.root=debug
  • 临时属性的加载优先级要高于配置文件的
  • idea中Program arguments(程序参数)VM options (虚拟机参数)就是添加临时属性的
  • 虚拟机参数一般用来设置系统属性(不常用)
  • 程序参数一般用来设置应用程序选项或参数(常用)
  • --server.port 选项应该在 java -jar 命令之后使用,而 -Dserver.port 选项应该在 -jar 命令前使用
java 复制代码
# 以应用参数的方式
java -jar my.jar --server.port=7788

# 或以 JDK 参数的方式
java -Dserver.port=7788 -jar my.jar

2、自定义配置文件

  • 方式一:使用临时属性设置配置文件名,注意仅仅是名称,不要带扩展名
xml 复制代码
--spring.config.name=myApplication
  • 方式二:使用临时属性设置配置文件路径或类路径,全路径名
xml 复制代码
--spring.config.location=classpath:/myApplication.yml

五、配置文件数据读取

1、读取单一数据

  • 使用@Value可以读取单个数据,属性名引用方式:${一级属性名.二级属性名......}
java 复制代码
@RestController
public class ReadConfigFile {

    @Value("${server.port}")
    private String myPort;

    @RequestMapping("/getValue")
    public String getValue(){
        System.out.println(myPort);//8080
        return "success";
    }
}

2、读取全部数据

  • SpringBoot提供了一个对象,能够把所有的数据都封装到这一个对象中,这个对象叫做Environment,使用getProperty方法获取
java 复制代码
@RestController
public class HelloController {

    @Autowired
    private Environment environment;

    @GetMapping("/hello")
    public String hello(){
        String personName = environment.getProperty("person.name");
        String petType = environment.getProperty("person.pet1[0].type");
        return "Hello,Spring Boot !";
    }
}

3、读取对象数据

  • 使用@ConfigurationProperties注解绑定配置信息到封装类中
  • 封装类需要定义为Spring管理的bean,否则无法进行属性注入

yml配置文件

yml 复制代码
person:
  name: zhang3
  age: 30
  pets:
    - type: dog
      age: 1
    - type: cat
      age: 2
  map:
    k1: v1
    k2: v2

属性注入的实体,使用时候直接@Autowired注入即可

java 复制代码
@Data
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String name;
    private Integer age;
    private List<Pets> pets;
    private Map<String,String> map;
}

@Data
class Pets {
    private String type;
    private Integer age;
}
  • 添加如下依赖,yml属性可以提示@ConfigurationProperties对应的实体的字段属性
xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

4、配置文件内的数据引用

  • 如文件属性内都具有相同的前缀
yml 复制代码
center:
  dataDir: /usr/local/fire/data
  tmpDir: /usr/local/fire/tmp
  logDir: /usr/local/fire/log
  msgDir: /usr/local/fire/msgDir
  • 可以使用引用格式来定义数据,其实就是搞了个变量名,然后引用变量
yml 复制代码
baseDir: /usr/local/fire
center:
  dataDir: ${baseDir}/data
  tmpDir: ${baseDir}/tmp
  logDir: ${baseDir}/log
  msgDir: ${baseDir}/msgDir

六、多环境开发

1、yml单一文件版

springboot 2.4.0以前版本

yml 复制代码
spring:
  profiles:
    active: dev #激活dev环境配置
---
spring:
  profiles: pro
server:
  port: 80
---
spring:
  profiles: dev
server:
  port: 81
---
spring:
  profiles: test
server:
  port: 82

springboot 2.4.0及以后的版本

  • spring.profiles为过时属性配置,不过也能使用
  • 替换属性为spring.config.activate.on-profile
yml 复制代码
spring:
  profiles:
    active: dev		#激活dev环境配置
---
spring:
  config:
    activate:
      on-profile: pro
server:
  port: 80
---
spring:
  config:
    activate:
      on-profile: dev
server:
  port: 81
---
spring:
  config:
    activate:
      on-profile: test
server:
  port: 82

2、yml多文件版

  • application.yml主配置文件
yml 复制代码
spring:
  profiles:
    active: pro		#激活pro环境
#其他公共属性
...
  • application-pro.yml生产环境配置文件
yml 复制代码
server:
  port: 81
  • application-dev.yml开发环境配置文件
yml 复制代码
server:
  port: 82
  1. 文件的命名规则为:application-环境名.yml
  2. 主配置文件中设置公共配置(全局)
  3. 环境分类配置文件中常用于设置冲突属性(局部)
  4. 主配置文件属性和环境分类配置文件属性冲突,后者优先级高

3、yml独立配置多文件版

  • 将所有的配置根据功能对配置文件中的信息进行拆分,并制作成独立的配置文件,命名规则如下
    • application-devDB.yml
    • application-devRedis.yml
    • application-devMVC.yml

SpringBoot2.4.0以前版本

  • 使用include属性在激活指定环境的情况下,同时对多个环境进行加载使其生效,多个环境间使用逗号分隔
yml 复制代码
spring:
  profiles:
    active: dev
    include: devDB,devRedis,devMVC
  • 相当于加载dev配置时,再加载对应的3组配置
  • 主环境最后加载
    • 当主环境dev与其他环境有相同属性时,主环境属性生效
    • 其他环境中有相同属性时,最后加载的环境属性生效
  • 如下展示加载顺序,最后加载的优先级最高(因为覆盖了相同的属性)

SpringBoot2.4.0及以后版本

  • 比如我要切换dev环境为pro时,include也要修改。因为include属性只能使用一次
  • SpringBoot从2.4版开始使用group属性替代include属性,降低了配置书写量
yaml 复制代码
spring:
  profiles:
    active: dev
      group:
        "dev": devDB,devRedis,devMVC
        "pro": proDB,proRedis,proMVC
        "test": testDB,testRedis,testMVC
  • 主环境最先加载
    • 环境中有相同属性时,最后加载的环境属性生效
  • 如下展示加载顺序,dev在第一位,相同属性会被覆盖

总之:配置文件后加载的会覆盖先加载的配置文件属性内容

相关推荐
Oneforlove_twoforjob3 分钟前
【Java基础面试题033】Java泛型的作用是什么?
java·开发语言
向宇it20 分钟前
【从零开始入门unity游戏开发之——C#篇24】C#面向对象继承——万物之父(object)、装箱和拆箱、sealed 密封类
java·开发语言·unity·c#·游戏引擎
小蜗牛慢慢爬行22 分钟前
Hibernate、JPA、Spring DATA JPA、Hibernate 代理和架构
java·架构·hibernate
星河梦瑾1 小时前
SpringBoot相关漏洞学习资料
java·经验分享·spring boot·安全
黄名富1 小时前
Redis 附加功能(二)— 自动过期、流水线与事务及Lua脚本
java·数据库·redis·lua
love静思冥想1 小时前
JMeter 使用详解
java·jmeter
言、雲1 小时前
从tryLock()源码来出发,解析Redisson的重试机制和看门狗机制
java·开发语言·数据库
TT哇1 小时前
【数据结构练习题】链表与LinkedList
java·数据结构·链表
Yvemil72 小时前
《开启微服务之旅:Spring Boot 从入门到实践》(三)
java
Anna。。2 小时前
Java入门2-idea 第五章:IO流(java.io包中)
java·开发语言·intellij-idea