Spring配置文件超詳細(xì)講解
什么是配置文件?
配置文件是一種存放應(yīng)用程序或系統(tǒng)配置的文件,包含了程序運行時所需要的各種選項和配置信息,例如字體樣式、默認(rèn)語言等。它允許開發(fā)者和用戶在不修改代碼的情況下,調(diào)整應(yīng)用程序的行為和性能。配置文件通常以文本形式存在,格式可以是XML、JSON、YAML(yml)、INI、Properties等。
配置文件的作用
配置文件主要是為了解決硬編碼代碼的問題,把可能會發(fā)生改變的信息,放在一個集中的地方,當(dāng)我們啟動某個程序時,應(yīng)用程序從配置文件中讀取數(shù)據(jù),并加載運行。
使用配置文件,可以使程序完成用戶和應(yīng)用程序的交互,或者應(yīng)用程序與其他應(yīng)用程序的交互。
硬編碼指的是將數(shù)據(jù)直接嵌入到程序或者其他可執(zhí)行對象的源代碼中,也就是我們常說的將“代碼寫死”。
SpringBoot配置文件
SpringBoot支持并定義了配置文件的格式,也是在另一個層面達(dá)到了規(guī)范其他框架集成到SpringBoot的目的。
很多項目或者框架的配置信息也放在配置文件中,如:
- 項目的啟動端口號
- 數(shù)據(jù)庫的連接信息(包含用戶名和密碼的設(shè)置)
- 第三方系統(tǒng)的調(diào)用密鑰等信息
- 用于發(fā)現(xiàn)和定位問題的普通日志和異常日志等
在SpringBoot中,內(nèi)置了Tomcat服務(wù)器,默認(rèn)端口號是8080,但在用戶電腦上8080端口號可能會被其他應(yīng)用程序占用,此外,如果啟動多個SpringBoot項目,那么端口號也需要不同,所以SpringBoot需要支持讓用戶自定義端口號。
配置文件格式
在SpringBoot中,有三種不同形式的配置文件:
- application.properties
- application.yml
- application.yaml
yml是yaml的縮寫,實際開發(fā)中出現(xiàn)的頻率最高。yaml和yml使用方式是一樣的,都是鍵值對的形式,所以后面我們只講yml。
當(dāng)應(yīng)?程序啟動時,SpringBoot會?動從classpath路徑找到并加載
application.properties 和 application.yaml 或者 application.yml ?件,當(dāng)然也可以使用 spring.config.name 指定文件路徑和名稱。
配置文件的優(yōu)先級
- 理論上,application.properties 和 application.yml 是可以同時存在同一個項目中的,當(dāng)這兩個配置文件都存在,兩個配置都會加載。如果配置文件內(nèi)容有沖突,以application.properties 為主,即 application.properties 的優(yōu)先級更高。
- 雖然在理論上兩個配置文件可以共存,但在實際的業(yè)務(wù)中,我們都是采用一種統(tǒng)一的配置文件,這樣可以更好的維護(hù)(降低故障率)。
properties配置文件說明
properties配置文件是最早期的配置文件格式,也就是創(chuàng)建SpringBoot項目默認(rèn)的配置文件。
properties基本語法
properties是以鍵值對的形式配置的,key和value之間用“=”來連接。
示例:
#配置項目端口號 server.port=9090 #配置數(shù)據(jù)庫連接信息 spring.datasource.url=jdbc:mysql://localhost:3306/beantext?characterEncoding=utf-8&useSSL=false #配置數(shù)據(jù)庫用戶名 spring.datasource.username=root #配置數(shù)據(jù)庫密碼 spring.datasource.password=root #配置數(shù)據(jù)庫驅(qū)動 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
配置文件中使用 # 來添加注釋信息。
讀取配置文件
在項目中,如果我們想要讀取到配置文件中的內(nèi)容,需要使用 @Value 注解,并且在注解中使用“${}”的格式來讀取。
my.text=hello world
package com.example.demo.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RequestMapping("/pro") @RestController public class PropertiesController { @Value("${my.text}") private String key; @RequestMapping("/text1") public String getValue() { return "獲取到的value為:" + key; } }
properties缺點
properties配置是以鍵值對的形式配置的,我們通過觀察,可以看到里面有些代碼比較冗余。
此外,properties配置格式對中文也是不友好,我們把value值換為中文,再來試一下:
my.text=你好 世界
為什么會這樣,我們可以打斷點看一下:
可以看到,key的值是四個問號。 但是idea默認(rèn)的字符集是UTF-8,是支持中文的,為了防止這種情況發(fā)生,所以我們在properties配置文件中盡量不要出現(xiàn)中文。
接下來,我們來講一下yml配置文件。
yml配置文件說明
yml是yaml的縮寫,全程是 Yet Another Markup Language 翻譯過來就是“另一種標(biāo)記語言”。
yml基本語法
yml是樹形結(jié)構(gòu)的配置文件,基本語法是:key: value(注意:冒號后面是有空格的,不能省略?。?!)
key后+(冒號+空格)
我們可以看到,正確的寫法的key是會有高亮提示的(橙色,當(dāng)然應(yīng)該可以設(shè)置成其他顏色),而對于錯誤的寫法,key還是灰色。
此外,只要冒號有空格隔開,就是正確的寫法,至于空格的數(shù)量,是不限的,當(dāng)然按照規(guī)范來寫的話,最好就一個。
使用yml連接數(shù)據(jù)庫
spring: datasource: url: jdbc:mysql://localhost:3306/beantext?characterEncoding=utf-8&useSSL=false username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver
可以看到,相對properties配置文件的寫法,yml配置文件的寫法不僅能夠體現(xiàn)出層級關(guān)系還能節(jié)省不必要的代碼。
此外,yml還有其他操作。
yml配置不同數(shù)據(jù)類型及null
# 字符串 string.value: hello # 布爾類型 boolean.value: true boolean.value1: false # 整數(shù)類型 int.value: 10 # 浮點數(shù) float.value: 3.14159 # Null ~ 代表null null.value: ~ # "" 空字符串 # '' 單引號也表示空字符串 # 冒號后面什么都不加也可以表示空字符串。但這種方式不直觀,更多的表示是使用引號括起來 empty: value1: '' value2: "" value3:
那么yml配置文件的屬性應(yīng)該如何獲?。?/p>
其實跟properties配置文件獲取屬性的操作一樣,都是要使用 @Value 注解來進(jìn)行獲取的。
package com.example.demo.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RequestMapping("/pro") @RestController public class PropertiesController { @Value("${string.value}") private String value; @Value("${boolean.value}") private Boolean value1; @Value("${boolean.value1}") private Boolean value2; @Value("${int.value}") private Integer value3; @Value("${float.value}") private Float value4; @Value("${null.value}") private String value5; @RequestMapping("/getValue") public String getValue() { return "獲取到的value為:" + value+" | "+value1+" | "+value2+" | "+value3+" | "+value4+" | "+value5; } }
注意事項
字符串默認(rèn)不用加上單引號或者雙引號,如果加英文的雙引號可以表示特殊的含義,而如果加英文的單引號則不會表示特殊的含義。
我們來看個例子來理解這段話的意思:
string: value1: Hello \n SpringBoot value2: 'Hello \n SpringBoot' value3: "Hello \n SpringBoot"
package com.example.demo.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RequestMapping("/pro") @RestController public class PropertiesController { @Value("${string.value1}") private String value1; @Value("${string.value2}") private String value2; @Value("${string.value3}") private String value3; @RequestMapping("/getValue") public String getValue() { System.out.println(value1); System.out.println(value2); System.out.println(value3); return "OK"; } }
可以看到,不加引號的和加單引號的不會讓“\n”進(jìn)行換行,而加雙引號的依舊會讓"\n"進(jìn)行換行操作。
我們可以得出結(jié)論:
- 字符串默認(rèn)不用加上單引號或雙引號;
- 單引號會轉(zhuǎn)義特殊字符,使其失去特殊功能,始終是一個普通的字符串;
- 雙引號不會轉(zhuǎn)義字符串里面的特殊字符,特殊字符會表示本身的含義。
可能會有點繞,\n本義是換行
使用單引號會轉(zhuǎn)義,就是說不再換行了,\n只是一個普通的字符串;
使用雙引號不會轉(zhuǎn)義,就是說\n依舊是它本身的含義,即換行。
這里我們來了解一個新的注解:@PostConstruct
@PostConstruct
@PostConstruct可以標(biāo)注在方法上,被標(biāo)注的方法會在Spring容器完成Bean的實例化和依賴注入之后自動執(zhí)行。所以我們這里可以偷個懶,后面的講解我們就使用這個注解來幫我們完成測試。
需要注意:
- 用該注解修飾的方法必須是非靜態(tài)方法;
- 不能有參數(shù);
- 返回類型通常是void。
配置對象
yml配置文件不僅能配置一些基本的數(shù)據(jù)類型,還能配置對象。
寫法如下:
#配置對象 student: name: '張三' age: 18
也可以寫成行的形式:
#行的形式 student1: {name: '張三', age: 18}
那么這個時候我們就不能使用 @Value 注解來獲取配置中的對象了,需要使用另外一個注解@ConfigurationProperties 來讀取,如下:
package com.example.demo.model; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Data @Component @ConfigurationProperties(prefix = "student")//prefix表示前綴 public class Student { private String name; private int age; }
@Controller public class PropertiesController { @Autowired private Student student; @PostConstruct public void getStudent() { System.out.println(student); } }
配置集合
ymp還可以配置集合。
配置格式:
在-后一定要加空格,否則-和后面的內(nèi)容就成了整體,統(tǒng)一賦值給對應(yīng)的屬性
type: list: - 'zhangsan' - 'lisi' - 'wangwu'
package com.example.demo.model; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.List; @Data @Component @ConfigurationProperties("type") public class ListConfig { private List<String> list; }
@Controller public class PropertiesController { @Autowired private ListConfig listConfig; @PostConstruct public void getList() { System.out.println(listConfig.toString()); } }
配置Map
package com.example.demo.model; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.Map; @Data @Component @ConfigurationProperties("maptypes") public class MapConfig { private Map<String, String> map; }
package com.example.demo.controller; import com.example.demo.model.ListConfig; import com.example.demo.model.MapConfig; import com.example.demo.model.Student; import jakarta.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired; 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.RestController; @Controller public class PropertiesController { @Autowired private MapConfig mapConfig; @PostConstruct public void getMap() { System.out.println(mapConfig); } }
yml配置文件的優(yōu)缺點
優(yōu)點
- 可讀性?,寫法簡單, 易于理解
- 采用縮進(jìn)和嵌套來表示層次結(jié)構(gòu),適合非常復(fù)雜配置的管理
- ?持更多的數(shù)據(jù)類型, 可以簡單表達(dá)對象, 數(shù)組, List,Map等數(shù)據(jù)形態(tài).
- ?持更多的編程語?, 不?是Java中可以使?, 在Golang, Python, Ruby, JavaScript中也可以使?
缺點
- 不適合寫復(fù)雜的配置?件
- 對格式有較強的要求(?個空格可能會引起?場?案),對縮進(jìn)敏感
總結(jié)
什么是配置文件?
配置文件是用來存放應(yīng)用程序或者系統(tǒng)的配置的文件,可以在不動源碼的情況下對應(yīng)用程序的性能和行為進(jìn)行調(diào)整,使用配置文件,可以使程序完成用戶和應(yīng)用程序的交互,或者應(yīng)用程序與其他應(yīng)用程序的交互。
SpringBoot的配置文件
Spring有三種配置文件:
- application.properties
- application.yml
- application.yaml
application.properties 和 application.yml 是可以同時存在同一個項目中的,以application.properties為主,.properties的優(yōu)先級更高。
配置文件的格式
- application.properties:鍵值對形式,key和value用“=”隔開
- application.yml:也是鍵值對,key和value用“冒號+空格”隔開。
讀取配置文件的方式
對于基本的數(shù)據(jù)類型,我們采用 @Value 注解即可,但對于對象、集合、map這些,我們需要使用 @ConfigurationProperties 。
@PostConstruct可以標(biāo)注在方法上,被標(biāo)注的方法會在Spring容器完成Bean的實例化和依賴注入之后自動執(zhí)行。要求是:方法不能是靜態(tài)方法,不能有參數(shù),返回值盡量為void。
到此這篇關(guān)于Spring配置文件的文章就介紹到這了,更多相關(guān)Spring配置文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
HttpClient的RedirectStrategy重定向處理核心機(jī)制
這篇文章主要為大家介紹了HttpClient的RedirectStrategy重定向處理核心機(jī)制源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10@RequestParam使用defaultValue屬性設(shè)置默認(rèn)值的操作
這篇文章主要介紹了@RequestParam使用defaultValue屬性設(shè)置默認(rèn)值的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02mybatis-plus數(shù)據(jù)權(quán)限實現(xiàn)代碼
這篇文章主要介紹了mybatis-plus數(shù)據(jù)權(quán)限實現(xiàn),結(jié)合了mybatis-plus的插件方式,做出了自己的注解方式的數(shù)據(jù)權(quán)限,雖然可能存在一部分的局限性,但很好的解決了我們自己去解析SQL的功能,需要的朋友可以參考下2023-06-06Java設(shè)計模式之迭代模式(Iterator模式)介紹
這篇文章主要介紹了Java設(shè)計模式之迭代模式(Iterator模式)介紹,本文用一個老師點名的現(xiàn)象描述了迭代模式的使用,需要的朋友可以參考下2015-03-03Java8新特性時間日期庫DateTime API及示例詳解
這篇文章主要介紹了Java8新特性時間日期庫DateTime API及示例詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10Java Swing實現(xiàn)坦克大戰(zhàn)游戲
這篇文章主要介紹了Java Swing實現(xiàn)坦克大戰(zhàn)游戲,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有很大的幫助喲,需要的朋友可以參考下2021-05-05