SpringBoot的配置文件(properties與yml)

文章目錄

  • 1. 配置文件的作用
  • 2. 配置文件格式
  • 3. 配置文件的使用方法
    • 3.1. properties配置文件
      • 3.1.1. 基本語法和使用
      • 3.1.2. properties優缺點分析
    • 3.2. yml配置文件
      • 3.2.1. 基本語法與使用
      • 3.2.2. yml中單雙引號問題
      • 3.2.3. yml配置不同類型的數據類型及null
      • 3.2.4. 配置對象
      • 3.2.5. 配置集合
      • 3.2.6. yml優點分析
  • 4. properties與yml的區別
  • 5. 設置不同環境的配置文件

1. 配置文件的作用

SpringBoot 項目中所有重要的數據都是在配置文件中配置的,比如∶

  • 數據庫的連接信息(包含用戶名和密碼的設置);
  • 項目的啟動端口;
  • 第三方系統的調用秘鑰等信息;
  • 用于發現和定位問題的普通日志和異常日志;
  • 還可以自定義配置,如配置上傳文件的保存地址信息等。

想象一下如果沒有配置信息,那么 Spring Boot 項目就不能連接和操作數據庫,甚至是不能保存可以用于排查問題的關鍵日志,所以配置文件的作用是非常重要的。

配置文件中的配置類型有兩類,一類是系統配置項,這種配置的格式都是固定的,是給系統(框架)使用的;另一種是用戶自定義配置,用戶可以隨意地規定配置項的格式,又用戶自行去設置和讀取。

2. 配置文件格式

SpringBoot 項目配置文件有兩種,一種是項目創建默認自帶的的properties文件,還有一種比較新的yml文件(需要自己添加)。

配置文件是存在于resources目錄下的,對于 SpringBoot 項目默認的配置文件,配置文件名必須是application,即application.propertiesapplication.yml文件,如果配置文件名不為application那就不能夠被識別加載。

img

properties是可以和yml?起存在于?個項?當中的,yml文件相比于properties文件做了一些優化,如yml文件天然支持中文字符,而properties文件默認是不支持中文字符的,如果不進行字符配置,輸入中文字符就會有亂碼現象。

application.propertiesapplication.yml兩個文件共存時, 雖然兩個文件中的配置都會被加載,但如果這兩個配置?件中出現了同樣的配置(比如 properties 和 yml 中都配置了“server.port” ), 那么這個時候會以properties中的配置為主,也就是.properties配置?件的優先級最?。

雖然理論上來講 .properties 可以和 .yml 共存,但實際的業務當中,我們通常會采取?種統?的配置?件格式,這樣可以更好的維護(降低故障率)。

3. 配置文件的使用方法

properties 配置文件是最早期的配置文件格式,也是創建 Spring Boot 項目默認的配置文件。

3.1. properties配置文件

3.1.1. 基本語法和使用

🎯基本語法:

properties 是以鍵值的形式配置的,key 和 value 之間是以“=”連接的, 使?“#”來添加注釋信息。

# key與=與value之間不要加空格
key=value

比如,設置端口號,我們可以使用配置項server.port來設置端口:

server.port=8088

配置修改完畢后,啟動程序,就可以看到端口號已經設置成配置文件中所設置的端口號了。
img

還有比如設置數據庫,配置項如下:

# 配置數據庫 URL
spring.datasource.url="jdbc:mysql://127.0.0.1:3306/tr?characterEncoding=utf8&useSSL=false"
# 配置數據庫 username
spring.datasource.name="root"
# 配置數據庫 password
spring.datasource.password="111111"
# 設置驅動
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

有關更多系統的配置,可以去看看官方文檔:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties

除了設置配置文件的信息除了系統的配置,我們還可以自定義配置,比如:

# 用戶自定義配置
custom.name=zhangsan
custom.id=666

🎯此時要讀取配置文件中的信息,我們可以使用@Value注解來實現,規則如下:

// 要注意${}不能省略
@Value("${配置信息key}")
private String name;

示例代碼:

package com.example.springboot.controller;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
@ResponseBody
public class TestController2 {// 自定義配置和系統配置都可以讀取@Value("${custom.name}")private String name;@Value("${custom.id}")private String id;@Value("${server.port}")private String port;@RequestMapping("/coustom")public String sayHi() {return "name : " + name + " "+ "id : " + id + " "+ "port : " + port;}
}

瀏覽器訪問結果:
img

3.1.2. properties優缺點分析

優點:

  • 配置文件結構清晰:key=value,不容易出錯,適合初學者。

缺點:

  • 寫法上比較冗余,臃腫,yml 配置文件能夠解決這個問題。img

3.2. yml配置文件

yml 是 YMAL(Yet Another Markup language)的縮寫,翻譯為另一種標記語言

3.2.1. 基本語法與使用

🎯基本語法:

yml 是樹型結構配置文件,特別需要注意的是 key 和 value 之間需要使用英文冒號加空格,空格一定是不能省略的。

# :后面空格一定不能省
key: value

此時,將上面的propertise轉換成yml格式看一下。

# 配置端口
server:port: 8088
# 配置數據庫
spring:datasource:url: "jdbc:mysql://127.0.0.1:3306/tr?characterEncoding=utf8&useSSL=false"username: "root"password: "111111"
# 自定義配置信息
custom:name: zhangsanid: 666

這里讀取 yml 配置文件的方式和 properties 配置文件是一樣的,就不再演示了。

3.2.2. yml中單雙引號問題

我們嘗試將配置文件中的配置信息設置成如下字樣:

string:str1: Hello \n Spring Boot.str2: 'Hello \n Spring Boot.'str3: "Hello \n Spring Boot."

我們將這些配置信息注入到一個類,我們嘗試來讀取它們,這個代碼 @Controller 在 Spring Boot 啟動時候會把 YmlString 對象注?到框架中,當注?到框架中時會執? @PostConstruct 初始化方法,就是此時讀到的配置信息。

@Controller
public class YmlString {@Value("${string.str1}")private String str1;@Value("${string.str2}")private String str2;@Value("${string.str3}")private String str3;@PostConstructpublic void postConstruct() {System.out.println("string.str1:" + str1);System.out.println("string.str2:" + str2);System.out.println("string.str3:" + str3);}
}

控制臺輸出結果:
img

這就說明,被雙引號包裹的值,是按照原語義執行的,而被單引號包裹值(特殊字符)會發生轉義,像上面的例子就是\n轉義成了\\n,所以就輸出了\n,最終就只是一個普通的字符串。

至于不加雙引號的輸出結果是因為 yml 中字符串默認是不加引號的,就直接輸出了。

3.2.3. yml配置不同類型的數據類型及null

格式如下:

# 字符串
string.value: Hello
# 布爾值,truefalse
boolean.value: true
boolean.value1: false
# 整數
int.value: 10
int.value1: 0b1010_0111_0100_1010_1110 # ?進制
# 浮點數
float.value: 3.14159
float.value1: 314159e-5 # 科學計數法
# Null,~代表null
null.value: ~

使用:

package com.example.springboot.controller;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;@Component
public class TestController3 {@Value("${string.value}")private String str;@Value("${boolean.value}")private boolean bool;@Value("${float.value}")private float flo;@Value("${null.value}")private Integer nul;@PostConstructpublic void postConsrtuct() {System.out.println("str: " + str);System.out.println("bool: " + bool);System.out.println("flo: " + flo);System.out.println("nul: " + nul);}
}

運行結果:

img

3.2.4. 配置對象

對于 ym l配置文件,還能進行對象的配置,如設置一個Student對象:

方式1:

student:id: 1name: 張三age: 18

方式2:

student: {id: 1,name: 張三,age: 18}

此時從配置文件讀取自定義的對象,就不可以使用 @Value 注解來讀取了,需要使用@ConfigurationProperties注解來進行對象的讀取,并且對應的類必須有getter和setter方法。

🍂示例:

學生類:

我們這里就不自己寫getter和setter方法了,我們使用 Lombok 框架中的 @Data 注解即可,其中就包含了get,set 和 toString,免去了手動創建的步驟了。

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Data
@ConfigurationProperties(prefix = "student")
@Component
public class Student {private int id;private String name;private int age;
}

使用類:

package com.example.springboot.controller;import com.example.springboot.model.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import javax.annotation.PostConstruct;@Controller
public class ConfigController {@Autowiredprivate Student student;@PostConstructpublic void postConsrtuct() {System.out.println(student);}
}

運行結果:
img

3.2.5. 配置集合

yml 還能配置集合

🎯比如配置 list 集合,配置方式如下:

方式1:

dbtypes:name:- mysql- sqlserver- db2

方式2(推薦):

dbtypes: {name: [mysql, sqlserver, db2]}

獲取與對象的獲取方式一模一樣,只是現在需要類里面的一個屬性為集合對象。

獲取示例:
與配置文件對應的對象。

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;import java.util.List;@Data
@ConfigurationProperties(prefix = "dbtypes")
@Component
public class ConfigList {private List<String> name;
}

使用類:

package com.example.springboot.controller;import com.example.springboot.model.ConfigList;
import org.springframework.stereotype.Controller;import javax.annotation.PostConstruct;
import javax.annotation.Resource;@Controller
public class ConfigController {@Resourceprivate ConfigList configList;@PostConstructpublic void postConstruct() {System.out.println(configList.getName());}
}

運行結果:
img

🎯再比如配置 map 集合,配置方式如下:

方式1:

tes:map:1: 張三2: 李四

方式2:

tes:maps: {1: 張三,2: 李四}

獲取示例:
與配置文件對應的對象:

package com.example.springboot.model;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Map;@Data
@ConfigurationProperties(prefix = "tes")
@Component
public class ConfigMap {private Map<Integer, String> map;
}

使用類:

package com.example.springboot.controller;import com.example.springboot.model.ConfigMap;
import org.springframework.stereotype.Controller;import javax.annotation.PostConstruct;
import javax.annotation.Resource;@Controller
public class ConfigController2 {@Resourceprivate ConfigMap configMap;@PostConstructpublic void postConstruct() {System.out.println(configMap.toString());}
}

運行結果:

img

3.2.6. yml優點分析

  1. yml 是?個可讀性?,寫法簡單、易于理解,它的語法和 JSON 語?類似。
  2. yml ?持更多的數據類型,它可以簡單表達清單(數組)、散列表,標量等數據形態。
  3. 它使?空? 符號縮進和?量依賴外觀的特?,特別適合?來表達或編輯數據結構、各種配置?件等。
  4. yml ?持更多的編程語?,它不?是 Java 中可以使?在 Golang、PHP、Python、Ruby、 JavaScript、Perl 中。

4. properties與yml的區別

  1. 語法不同:properties 是 以key = value 的形式配置的鍵值類型的配置文件,而 yml 使用的是類似于 json 格式的樹型配置方式進行配置的,yml 層級之間使用的是換行縮進的方式配置的,key 和 value 之間使用英文冒號:加空格的方式設置的,且空格不可省略。
  2. properties 為早期并且默認的配置文件格式,但配置存在一定的冗余數據,使用 yml 可以很好的解決數據冗余問題。
  3. yml 通用性更好,支持更多語言,如 Java、Go、Python,如果是云服務器開發,可以使用一份 yml 配置文件作為 Java 和 Go 的共同配置文件。
  4. yml 和 properties 可以共存,但一個項目中建議使用統一的配置類型文件。
  • yml 相較于 properties 支持更多的數據類型,如對象和集合。

5. 設置不同環境的配置文件

在日常開發中,通常會使用至少三個不同的環境:開發環境(dev)、測試環境(test)和生產環境(prod);每個環境的配置都不相同,包括數據庫、端口、IP 地址等信息;那么如何區分這些環境,如何打包呢?

Spring Boot 中提供了很好的多環境整合支持,可以在打包和運行時自由切換不同的環境。

為了方便管理不同環境的配置,可以將它們放在不同的配置文件中,此時我們就需要創建不同環境的配置文件了,例如application-dev.propertiesapplication-test.propertiesapplication-prod.properties

需要注意的是,配置文件的命名必須遵循application-name.propertiesapplication-name.yml的格式,其中的name可以自定義,用于區分不同的環境。

因此,在整個項目中,需要有四個配置文件,包括application.properties(主配置文件,是必須存在的)和三個不同環境的配置文件。

img

此時創建了各個環境的配置文件條件下,還需要告訴 SpringBoot 你要運行哪個環境,主要有兩種指定方式。

🎯方式1:在主配置文件中指定

可以在主配置文件(application.properties或者application.yml)中指定,內容如下:

# 指定運行環境為測試環境(application.properties)
spring.profiles.active=test# 指定運行環境為生產環境(application.xml)
spring:profiles:active: pord

此時,SpringBoot 首先默認會加載application.properties文件,而這個的文件配置又告訴 SpringBoot 去找指定環境的配置文件。

🎯方式2:運行 jar 的時候指定

SpringBoot 內置的環境切換能夠在運行Jar包的時候指定環境,命令如下:

java -jar xxx.jar --spring.profiles.active=test

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/39896.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/39896.shtml
英文地址,請注明出處:http://en.pswp.cn/news/39896.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

android設置豎屏仍然跟隨屏幕旋轉怎么辦

如題所問&#xff0c;我最近遇到一個bug&#xff0c;就是設置了搖感&#xff0c;然后有用戶反饋說設置了手機下拉的系統設置-屏幕旋轉-關閉。然后屏幕還是會旋轉的問題。 首先&#xff0c;我們先從如何設置橫豎屏了解下好了 設置橫屏和豎屏的方法&#xff1a; 方法一&#x…

uni-app引入sortable列表拖拽,兼容App和H5,拖拽排序。

效果: 拖拽排序 背景&#xff1a; 作為一名前端開發人員&#xff0c;在工作中難免會遇到拖拽功能&#xff0c;分享一個github上一個不錯的拖拽js庫&#xff0c;能滿足我們在項目開發中的需要&#xff0c;下面是我在uniapp中使用SortableJS的使用詳細流程&#xff1b; vue開發…

Centos7安裝docker后默認開啟docker0的網卡|卸載默認網卡

一&#xff1a; 停掉服務 systemctl stop docker [rootwww ~]# systemctl stop docker [rootwww ~]# systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor prese…

神經網絡基礎-神經網絡補充概念-27-深層網絡中的前向傳播

概念 深層神經網絡中的前向傳播是指從輸入數據開始&#xff0c;逐層計算每個神經元的輸出值&#xff0c;直到得到最終的預測值。 一般步驟 1輸入數據傳遞&#xff1a; 將輸入數據傳遞給網絡的輸入層。輸入數據通常是一個特征矩陣&#xff0c;每一列代表一個樣本&#xff0c;…

【bug】Unity無法創建項目

bug UnityHub無法創建項目 UnityHub無法創建項目 出現的問題&#xff1a;在創建新項目時彈出來一個 無法創建項目 嘗試的方法&#xff1a; 刷新許可證 ?沒用退出賬號重新登陸 ?沒用重啟電腦 ?沒用 最后發現是什么問題呢&#xff1f; 2021.3.3這個版本我之前在資源管理器中…

SpringBoot概述及項目的創建使用

文章目錄 一. Spring Boot概述1. 什么是Spring Boot&#xff1f;2. Spring Boot的優點 二. Spring Boot項目的創建1. 使用IDEA創建1.1. 準備工作1.2. 創建運行Spring Boot項目1.3. 進行Web交互1.4. 目錄工程介紹1.5. 項目快速添加依賴1.6. 防止配置文件亂碼所需的配置1.7. Spri…

Docker實戰專欄簡介

&#x1f337;&#x1f341; 博主貓頭虎 帶您 Go to New World.?&#x1f341; &#x1f984; 博客首頁——貓頭虎的博客&#x1f390; &#x1f433;《面試題大全專欄》 文章圖文并茂&#x1f995;生動形象&#x1f996;簡單易學&#xff01;歡迎大家來踩踩~&#x1f33a; &a…

【iMessage蘋果推?IM推送】群控腳本當Apple APNS推送服務器從您的應用程序接吸收注冊消息時,它將為您回到一串devicetoken

推薦內容IMESSGAE相關 作者??IMEAE推薦內容iMessage蘋果推軟件 *** 點擊即可查看作者要求內容信息作者??IMEAE推薦內容1.家庭推內容 *** 點擊即可查看作者要求內容信息作者??IMEAE推薦內容2.相冊推 *** 點擊即可查看作者要求內容信息作者??IMEAE推薦內容3.日歷推 *** …

Rust軟件外包開發語言的特點

Rust 是一種系統級編程語言&#xff0c;強調性能、安全性和并發性的編程語言&#xff0c;適用于廣泛的應用領域&#xff0c;特別是那些需要高度可靠性和高性能的場景。下面和大家分享 Rust 語言的一些主要特點以及適用的場合&#xff0c;希望對大家有所幫助。北京木奇移動技術有…

MongoDB:簡單的增刪改查操作

一.概述 本篇文章介紹在Navicat中對MongoDB數據庫進行增刪改查操作,在后面會介紹在Spring Boot中使用MongoTemplate對MongoDB數據庫進行相關操作.如有必要可以先看看前面幾篇文章. MongoDB:MySQL,Redis,ES,MongoDB的應用場景 MongoDB:數據庫初步應用 二.在Navicat進行增刪改…

linux系統服務學習(七)NFS服務、DHCP服務

文章目錄 一、NFS服務概述1、任務背景2、環境準備3、NFS概述4、NFS組成5、與NFS相關的軟件包6、安裝NFS軟件7、NFS的配置文件 二、NFS實驗1、搭建NFS服務器2、編寫NFS主配置文件3、啟動相關的NFS服務4、搭建Web服務器5、在Web服務器中掛載NFS6、上傳aws.mp4視頻到NFS服務器的/s…

人工智能學習框架—飛槳Paddle人工智能

1.人工智能框架 機器學習的三要素&#xff1a;模型、學習策略、優化算法。 當我們用機器學習來解決一些模式識別任務時&#xff0c;一般的流程包含以下幾個步驟&#xff1a; 1.1.淺層學習和深度學習 淺層學習(Shallow Learning)&#xff1a;不涉及特征學習&#xff0c;其特征…

Vue3 setup中使用$refs

在 Vue 3 中的 Composition API 中&#xff0c;$refs 并不直接可用于 setup 函數。這是因為 $refs 是 Vue 2 的實例屬性&#xff0c;而在 Vue 3 中&#xff0c;setup 函數是與模板實例分離的&#xff0c;不再使用實例屬性。 實際工作中確實有需求&#xff0c;在setup 函數使用…

迪瑞克斯拉算法

迪銳克斯拉算法 簡單來說就是在有向圖中&#xff0c;給定一個圖中具體的出發點&#xff0c;從這個點出發能夠到達的所有的點&#xff0c;每個點的最短距離是多少。到不了的點&#xff0c;距離則是正無窮。有向&#xff0c;無負權重&#xff0c;可以有環。 所以說&#xff0c;迪…

流媒體服務-傳輸延時(SEI插幀)

什么是延時 很多小伙伴認為&#xff0c;當推流端和拉流端顯示的時間不一致&#xff0c;即為延時。 其實這種看法是比較片面的&#xff0c;不同的播放器&#xff0c;對同一路流進行測試&#xff0c;可能會得到不同的結果。 一般來說&#xff0c;延時為以下幾個部分的累加組成 …

【Android】解決Lint found fatal errors while assembling a release target

報錯信息&#xff1a; Android在debug模式下打包沒有問題&#xff0c;但是在打包release版本時出現一下問題&#xff1a; 結果圖 原因 我項目的原因是因為把正式、測試地址放到代碼里了&#xff0c;忘記選中正式環境的地址&#xff0c;導致打正式包有問題&#xff1b;大家如果…

Shell編程學習之變量的使用

查看當前系統使用的命令解釋器&#xff1a; linuxubuntu:~$ echo $SHELL /bin/bashshell命令&#xff1a;在終端上使用的命令&#xff0c;例如 vi a.cgcc a.c./a.outshell腳本&#xff1a;其是一個.sh文件&#xff0c;里面都是命令的集合&#xff0c;以及一些復雜的邏輯&#…

RuntimeException詳解

當我們談論Java編程中的異常處理時&#xff0c;RuntimeException是一個關鍵的概念&#xff0c;它在代碼開發和維護中扮演著重要的角色。本文將深入探討RuntimeException&#xff0c;了解它的特點、使用場景以及如何在代碼中處理它。 什么是RuntimeException&#xff1f; 在Ja…

復合 類型

字符串和切片 切片 切片的作用是允許你引用集合中部分連續的元素序列&#xff0c;而不是引用整個集合。 例如&#xff1a; let s String::from("hello world");let hello &s[0..5]; // 切片 [0,5) 等效于&s[..5] let world &s[6..11]; // 切片…

線性動態規劃入門之挖地雷

P2196 [NOIP1996 提高組] 挖地雷 - 洛谷 | 計算機科學教育新生態 (luogu.com.cn) 這個題有點坑&#xff0c;就是說你只能往下挖&#xff0c;可以理解成單項路徑。比如1與3之間是1代表1可以到3而3不可以到1。所以我們來思考dp把。怎么寫&#xff1f;我們這么想假設1與2&#xf…