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