前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >SpringBoot基础(二):配置文件详解

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

作者头像
冬天vs不冷
发布2025-01-21 10:28:09
发布2025-01-21 10:28:09
16400
代码可运行
举报
文章被收录于专栏:springbootspringboot
运行总次数:0
代码可运行

SpringBoot基础系列文章

SpringBoot基础(一):快速入门

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

一、配置文件分类

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

  • application.properties(传统格式/默认格式)
代码语言:javascript
代码运行次数:0
复制
server.port=81
  • application.yml(主流格式)
代码语言:javascript
代码运行次数:0
复制
server:
  port: 82
  • application.yaml
代码语言:javascript
代码运行次数:0
复制
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会显示为换行符】**
  • 字符串可以拆成多行,换行符会被转化成一个**空格**
  • |**开头,大文本写在下层,保留文本格式,换行符正确显示**
代码语言:javascript
代码运行次数:0
复制
str1: 哈喽
str2: 哈喽 
 你好
    呀
str3: '哈喽 \n 你好'
str4: "哈喽 \n 你好"
str5: |
 哈喽
  你好

# 转为json样式如下
{"str1":"哈喽","str2":"哈喽 你好 呀","str3":"哈喽 \\n 你好","str4":"哈喽 \n 你好","str5":"哈喽\n 你好"}
1.2、布尔类型
  • true**、**yes**、**on**皆为真,不区分每个字母大小写**
  • false**、**no**、**off**皆为假,不区分每个字母大小写**
代码语言:javascript
代码运行次数:0
复制
flag1: true
flag2: False
flag3: yes
flag4: NO
# 转为json样式如下
{"flag1":true,"flag2":false,"flag3":true,"flag4":false}
  • 如果出现大写字母会提示异常,不过不影响
1.3、整数型
  • 支持二进制、八进制、十六进制
代码语言:javascript
代码运行次数:0
复制
num1: 666
num2: 0001_0000 # 支持二进制、八进制、十六进制
 
# 转为json样式如下
{"num1":666,"num2":4096}
1.4、浮点型
  • 支持科学计数法
代码语言:javascript
代码运行次数:0
复制
f1: 1.1
f2: 1.1e-2 # 使用科学计数法
 
# 转为json样式如下
{"f1":1.1,"f2":0.011}
1.5、空(Null)
  • null**、**Null**和**~**都是空,不指定值默认也是空**
代码语言:javascript
代码运行次数:0
复制
str6: null
str7: Null
str8: ~
str9:
 
# 转为json样式如下
{"str6":"","str7":"","str8":"","str9":""}
1.6、时间类型
  • java.util.Date**类型**
代码语言:javascript
代码运行次数:0
复制
#  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设置属性
代码语言:javascript
代码运行次数:0
复制
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
代码语言:javascript
代码运行次数:0
复制
person:
  #数组格式一
  subject:
    - Java
    - 前端
    - 大数据

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

# 转为json样式如下
{"likes":["王者荣耀","刺激战场"],"subject":["Java","前端","大数据"]}
1.9、对象数组、对象list、对象set
代码语言:javascript
代码运行次数:0
复制
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格式

代码语言:javascript
代码运行次数:0
复制
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 --属性名=值
  • 多个临时属性之间使用空格分隔
代码语言:javascript
代码运行次数:0
复制
java –jar springboot.jar --server.port=80 --logging.level.root=debug
  • idea中**Program arguments(程序参数)**或**VM options (虚拟机参数)**就是添加临时属性的
  • 虚拟机参数一般用来设置**JVM系统属性**,在**java -jar命令之间**使用(不常用,由JVM解析)
  • 程序参数(又叫命令行参数)一般用来设置**应用程序选项或参数**,在**java -jar命令之后**使用(常用,由SpringBoot解析)
  • 通过命令行传递的参数,具有最高优先级,能够覆盖所有其他配置
代码语言:javascript
代码运行次数:0
复制
# 以应用参数的方式
java -jar my.jar --server.port=7788

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

2、自定义配置文件

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

五、配置文件数据读取

1、读取单一数据

  • 使用**@Value**可以读取单个数据,属性名引用方式:**${一级属性名.二级属性名……}**
代码语言:javascript
代码运行次数:0
复制
@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**方法获取
代码语言:javascript
代码运行次数:0
复制
@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配置文件

代码语言:javascript
代码运行次数:0
复制
person:
  name: zhang3
  age: 30
  pets:
    - type: dog
      age: 1
    - type: cat
      age: 2
  map:
    k1: v1
    k2: v2

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

代码语言:javascript
代码运行次数:0
复制
@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对应的实体的字段属性
代码语言:javascript
代码运行次数:0
复制
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

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

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

六、多环境开发

  • 激活的Profile配置文件,优先级高于默认配置文件,但低于命令行参数

1、yml单一文件版

springboot 2.4.0以前版本

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

3、yml独立配置多文件版

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

SpringBoot2.4.0以前版本

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

SpringBoot2.4.0及以后版本

  • 比如我要切换dev环境为pro时,include也要修改。因为include属性只能使用一次
  • SpringBoot从2.4版开始使用**group属性**替代**include属性**,降低了配置书写量
代码语言:javascript
代码运行次数:0
复制
spring:
  profiles:
    active: dev
      group:
        "dev": devDB,devRedis,devMVC
        "pro": proDB,proRedis,proMVC
        "test": testDB,testRedis,testMVC
  • 主环境dev**最先**加载,环境中有相同属性时,最后加载的环境属性生效
  • 如下展示加载顺序,dev在第一位,相同属性会被覆盖
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-11-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、配置文件分类
  • 二、配置文件优先级
    • 1、不同版本优先级
    • 2、不同位置优先级
  • 三、配置文件格式
    • 1、yml和yaml格式
      • 1.1、字符串
      • 1.2、布尔类型
      • 1.3、整数型
      • 1.4、浮点型
      • 1.5、空(Null)
      • 1.6、时间类型
      • 1.7、对象(属性和值)、Map(键值对)
      • 1.8、数组、list、set
      • 1.9、对象数组、对象list、对象set
    • 2、properties格式
  • 四、临时属性设置
    • 1、临时属性
    • 2、自定义配置文件
  • 五、配置文件数据读取
    • 1、读取单一数据
    • 2、读取全部数据
    • 3、读取对象数据
    • 4、配置文件内的数据引用
  • 六、多环境开发
    • 1、yml单一文件版
    • 2、yml多文件版
    • 3、yml独立配置多文件版
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档