一文帶你看懂SpringBoot中的全局配置文件
全局配置文件能夠?qū)σ恍┠J(rèn)配置值進(jìn)行修改。
Spring Boot使用一個(gè)application.properties或者application.yaml的文件作為全局配置文件,該文件存放在src/main/resource目錄或者類路徑的/config,一般會(huì)選擇resource目錄。
接下來(lái),將針對(duì)這兩種全局配置文件進(jìn)行講解 :
Spring Boot配置文件的命名及其格式:
- application.properties
- application.yaml
- application.yml
1.application.properties配置文件
使用Spring Initializr方式構(gòu)建Spring Boot項(xiàng)目時(shí),會(huì)在resource目錄下自動(dòng)生成一個(gè)空的application.properties文件,Spring Boot項(xiàng)目啟動(dòng)時(shí)會(huì)自動(dòng)加載application.properties文件。
我們可以在application.properties文件中定義Spring Boot項(xiàng)目的相關(guān)屬性
當(dāng)然,這些相關(guān)屬性可以是系統(tǒng)屬性、環(huán)境變量、命令參數(shù)等信息,也可以是自定義配置文件名稱和位置
#修改tomcat的版本號(hào) server.port=8888 #定義數(shù)據(jù)庫(kù)的連接信息 JdbcTemplate spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/lagou spring.datasource.username=root spring.datasource.password=wu7787879
接下來(lái),通過(guò)一個(gè)案例對(duì)Spring Boot項(xiàng)目application.properties配置文件的具體使用進(jìn)行講解 演示:
預(yù)先準(zhǔn)備了兩個(gè)實(shí)體類文件,后續(xù)會(huì)演示application.properties配置文件中的自定義配置屬性注入到Person實(shí)體類的對(duì)應(yīng)屬性中
創(chuàng)建實(shí)體類
先在項(xiàng)目的com.lagou包下創(chuàng)建一個(gè)pojo包,并在該包下創(chuàng)建兩個(gè)實(shí)體類Pet和Person
public class Pet { private String type; private String name; }
@Data @Component @ConfigurationProperties(prefix = "person") public class Person { private int id; //id private String name; //名稱 private List hobby; //愛(ài)好 private String[] family; //家庭成員 private Map map; private Pet pet; //寵物 }
@ConfigurationProperties(prefix = “person”)注解的作用是將配置文件中以person開(kāi)頭的屬性值通過(guò)setXX()方法注入到實(shí)體類對(duì)應(yīng)屬性中@Component注解的作用是將當(dāng)前注入屬性值的Person類對(duì)象作為Bean組件放到Spring容器中,只有這樣@ConfigurationProperties注解進(jìn)行賦值
打開(kāi)項(xiàng)目的resources目錄
打開(kāi)項(xiàng)目的resources目錄下的application.properties配置文件,在該配置文件中編寫需要對(duì)Person類設(shè)置的配置屬性
#自定義配置信息 person.id=1 person.name=王二麻子 person.hobby=read,write person.family=father,mather person.map.key1=value1 person.map.key2=value2 person.pet.type=dog person.pet.name=哈士奇
查看application.properties配置文件是否正確
同時(shí)查看屬性配置效果,打開(kāi)通過(guò)IDEA工具創(chuàng)建的項(xiàng)目測(cè)試類,在該測(cè)試類中引入Person實(shí)體類Bean,并進(jìn)行輸出測(cè)試
@RunWith(SpringRunner.class) // 測(cè)試啟動(dòng)器,并加載Spring Boot測(cè)試注解 @SpringBootTest // 標(biāo)記為Spring Boot單元測(cè)試類,并加載項(xiàng)目的ApplicationContext上下文環(huán) 境 class SpringbootDemoApplicationTests { // 配置測(cè)試 @Autowired private Person person; @Test void configurationTest() { System.out.println(person); } }
打印結(jié)果:
可以看出,測(cè)試方法configurationTest()運(yùn)行成功,同時(shí)正確打印出了Person實(shí)體類對(duì)象。至此,說(shuō)明application.properties配置文件屬性配置正確,并通過(guò)相關(guān)注解自動(dòng)完成了屬性注入
中文亂碼問(wèn)題解決
調(diào)整文件編碼格式:
設(shè)置Tomcat及Http編碼
#解決中文亂碼 server.tomcat.uri-encoding=UTF-8 spring.http.encoding.force=true spring.http.encoding.charset=UTF-8 spring.http.encoding.enabled=true
2. application.yaml配置文件
YAML文件格式是Spring Boot支持的一種JSON文件格式,相較于傳統(tǒng)的Properties配置文件,YAML文件以數(shù)據(jù)為核心,是一種更為直觀且容易被電腦識(shí)別的數(shù)據(jù)序列化格式。application.yaml配置文件的 工作原理和application.properties是一樣的,只不過(guò)yaml格式配置文件看起來(lái)更簡(jiǎn)潔一些。
YAML文件的擴(kuò)展名可以使用.yml或者.yaml。
application.yml文件使用 “key:(空格)value”格式配置屬性,使用縮進(jìn)控制層級(jí)關(guān)系。
SpringBoot的三種配置文件是可以共存的:
這里,針對(duì)不同數(shù)據(jù)類型的屬性值,介紹一下YAML
value值為普通數(shù)據(jù)類型
value值為普通數(shù)據(jù)類型(例如數(shù)字、字符串、布爾等)
當(dāng)YAML配置文件中配置的屬性值為普通數(shù)據(jù)類型時(shí),可以直接配置對(duì)應(yīng)的屬性值,同時(shí)對(duì)于字符串類型的屬性值,不需要額外添加引號(hào),示例代碼如下
server: port: 8080 servlet: context-path: /hello
value值為數(shù)組和單列集合
當(dāng)YAML配置文件中配置的屬性值為數(shù)組或單列集合類型時(shí),主要有兩種書寫方式:縮進(jìn)式寫法和行內(nèi)式寫法。
其中,縮進(jìn)式寫法還有兩種表示形式,示例代碼如下
person: hobby: - play - read - sleep
或者使用如下示例形式
person: hobby: play, read, sleep
上述代碼中,在YAML配置文件中通過(guò)兩種縮進(jìn)式寫法對(duì)person對(duì)象的單列集合(或數(shù)組)類型的愛(ài)好hobby賦值為play、read和sleep。其中一種形式為“-(空格)屬性值”,另一種形式為多個(gè)屬性值之前加英文逗號(hào)分隔(注意,最后一個(gè)屬性值后不要加逗號(hào))。
person: hobby: [play,read,sleep]
通過(guò)上述示例對(duì)比發(fā)現(xiàn),YAML配置文件的行內(nèi)式寫法更加簡(jiǎn)明、方便。另外,包含屬性值的中括號(hào)“[]”還可以進(jìn)一步省略,在進(jìn)行屬性賦值時(shí),程序會(huì)自動(dòng)匹配和校對(duì)
value值為Map集合和對(duì)象
當(dāng)YAML配置文件中配置的屬性值為Map集合或?qū)ο箢愋蜁r(shí),YAML配置文件格式同樣可以分為兩種書寫方式:縮進(jìn)式寫法和行內(nèi)式寫法。
其中,縮進(jìn)式寫法的示例代碼如下
person: map: k1: v1 k2: v2
對(duì)應(yīng)的行內(nèi)式寫法示例代碼如下
person: map: {k1: v1,k2: v2}
在YAML配置文件中,配置的屬性值為Map集合或?qū)ο箢愋蜁r(shí),縮進(jìn)式寫法的形式按照YAML文件格式編寫即可,而行內(nèi)式寫法的屬性值要用大括號(hào)“{}”包含。
接下來(lái),在Properties配置文件演示案例基礎(chǔ)上,通過(guò)配置application.yaml配置文件對(duì)Person對(duì)象進(jìn)行賦值,具體使用如下
(1)在項(xiàng)目的resources目錄下,新建一個(gè)application.yaml配置文件,在該配置文件中編寫為Person類設(shè)置的配置屬性
#對(duì)實(shí)體類對(duì)象Person進(jìn)行屬性配置 person: id: 1 name: 王二麻子 family: - 妻 - 妾 hobby: - play - read - sleep map: k1: value1 k2: value2 pet: type: 狗 name: 哈士奇
(2)再次執(zhí)行測(cè)試結(jié)果
Person{ id=1, name='王二麻子', hobby=[play, read, sleep], family=[妻, 妾], map={k1=value1,k2=value2}, pet=Pet{type='狗', name='哈士奇'} }
可以看出,測(cè)試方法configurationTest()同樣運(yùn)行成功,并正確打印出了Person實(shí)體類對(duì)象。
需要說(shuō)明的是,本次使用application.yaml配置文件進(jìn)行測(cè)試時(shí)需要提前將application.properties配置文件中編寫的配置注釋,這是因?yàn)閍pplication.properties配置文件會(huì)覆蓋application.yaml配置文件
3. 配置文件屬性值的注入
配置文件的優(yōu)先級(jí)如下: 從低到高
<includes> <include>**/application*.yml</include> <include>**/application*.yaml</include> <include>**/application*.properties</include> </includes
使用Spring Boot全局配置文件設(shè)置屬性時(shí):
如果配置屬性是Spring Boot已有屬性,例如服務(wù)端server.port,那么Spring Boot內(nèi)部會(huì)自動(dòng)掃描并讀取這些配置文件中的屬性值并覆蓋默認(rèn)屬性。
如果配置的屬性是用戶自定義屬性,例如剛剛自定義的Person實(shí)體類屬性,還必須在程序中注入這些配置屬性方可生效。
Spring Boot支持多種注入配置文件屬性的方式,下面來(lái)介紹如何使用注解@ConfigurationProperties和@Value注入屬性
4. 使用@ConfigurationProperties注入屬性
Spring Boot提供的@ConfigurationProperties注解用來(lái)快速、方便地將配置文件中的自定義屬性值批量注入到某個(gè)Bean對(duì)象的多個(gè)對(duì)應(yīng)屬性中。
假設(shè)現(xiàn)在有一個(gè)配置文件,如果使用 @ConfigurationProperties注入配置文件的屬性,示例代碼如下:
@Data @Component //將配置文件中所有以person開(kāi)頭的配置信息注入當(dāng)前類中 //前提1:必須保證配置文件中person.xx與當(dāng)前Person類的屬性名一致 //前提2:必須保證當(dāng)前Person中的屬性都具有set方法 @ConfigurationProperties(prefix = "person") public class Person { private int id; //id private String name; //名稱 private List hobby; //愛(ài)好 private String[] family; //家庭成員 private Map map; private Pet pet; //寵物 }
上述代碼使用@Component和@ConfigurationProperties(prefix = “person”)將配置文件中的每個(gè)屬性映射到person類組件中。
5. 使用@Value注入屬性
@Value注解是Spring框架提供的,用來(lái)讀取配置文件中的屬性值并逐個(gè)注入到Bean對(duì)象的對(duì)應(yīng)屬性中,Spring Boot框架從Spring框架中對(duì)@Value注解進(jìn)行了默認(rèn)繼承,所以在Spring Boot框架中還可以 使用該注解讀取和注入配置文件屬性值。使用@Value注入屬性的示例代碼如下
@Component public class Person { @Value("${person.id}") private int id; }
上述代碼中,使用@Component和@Value注入Person實(shí)體類的id屬性。其中,@Value不僅可以將配置文件的屬性注入Person的id屬性,還可以直接給id屬性賦值,這點(diǎn)是@ConfigurationProperties不支持的
演示@Value注解讀取并注入配置文件屬性的使用:
創(chuàng)建實(shí)體類
在com.lagou.pojo包下新創(chuàng)建一個(gè)實(shí)體類Student,并使用@Value注解注入屬性
@Component public class Student { @Value("${person.id}") private int id; @Value("${person.name}") private String name; //名稱 //省略toString }
Student類使用@Value注解將配置文件的屬性值讀取和注入。 從上述示例代碼可以看出,使用@Value注解方式需要對(duì)每一個(gè)屬性注入設(shè)置,同時(shí)又免去了屬性的setXX()方法
再次打開(kāi)測(cè)試類進(jìn)行測(cè)試
@Autowired private Student student; @Test public void studentTest() { System.out.println(student); }
打印結(jié)果:
可以看出,測(cè)試方法studentTest()運(yùn)行成功,同時(shí)正確打印出了Student實(shí)體類對(duì)象。需要說(shuō)明的是,本示例中只是使用@Value注解對(duì)實(shí)例中Student對(duì)象的普通類型屬性進(jìn)行了賦值演示,而@Value注 解對(duì)于包含Map集合、對(duì)象以及YAML文件格式的行內(nèi)式寫法的配置文件的屬性注入都不支持,如果賦值會(huì)出現(xiàn)錯(cuò)誤.
6. 自定義配置
spring Boot免除了項(xiàng)目中大部分的手動(dòng)配置,對(duì)于一些特定情況,我們可以通過(guò)修改全局配置文件以適應(yīng)具體生產(chǎn)環(huán)境,可以說(shuō),幾乎所有的配置都可以寫在application.yml文件中,Spring Boot會(huì)自 動(dòng)加載全局配置文件從而免除我們手動(dòng)加載的煩惱。
但是,如果我們自定義配置文件,Spring Boot是無(wú)法識(shí)別這些配置文件的,此時(shí)就需要我們手動(dòng)加載。接下來(lái),將針對(duì)Spring Boot的自定義配置文件及其加載方式進(jìn)行講解
使用@PropertySource加載配置文件
對(duì)于這種加載自定義配置文件的需求,可以使用@PropertySource注解來(lái)實(shí)現(xiàn)。@PropertySource注解用于指定自定義配置文件的具體位置和名稱
當(dāng)然,如果需要將自定義配置文件中的屬性值注入到對(duì)應(yīng)類的屬性中,可以使用@ConfigurationProperties或者@Value注解進(jìn)行屬性值注入
演示:
1、新建一個(gè)配置文件
打開(kāi)Spring Boot項(xiàng)目的resources目錄,在項(xiàng)目的類路徑下新建一個(gè)test.properties自定義配置文件,在該配置文件中編寫需要設(shè)置的配置屬性
#對(duì)實(shí)體類對(duì)象MyProperties進(jìn)行屬性配置 test.id=110 test.name=test
2、創(chuàng)建一個(gè)配置類MyProperties
在com.lagou.pojo包下新創(chuàng)建一個(gè)配置類MyProperties,提供test.properties自定義配置文件中對(duì)應(yīng)的屬性,并根據(jù)@PropertySource注解的使用進(jìn)行相關(guān)配置
@Component // 自定義配置類 @PropertySource("classpath:test.properties") // 指定自定義配置文件位置和名稱 @ConfigurationProperties(prefix = "test") // 指定配置文件注入屬性前綴 public class MyProperties { private int id; private String name; // 省略屬性getXX()和setXX()方法 // 省略toString()方法 }
主要是一個(gè)自定義配置類,通過(guò)相關(guān)注解引入了自定義的配置文件,并完成了自定義屬性值的注入。針對(duì)示例中的幾個(gè)注解,具體說(shuō)明如下
- @PropertySource(“classpath:test.properties”)注解指定了自定義配置文件的位置和名稱,此示例表示自定義配置文件為classpath類路徑下的test.properties文件;
- @ConfigurationProperties(prefix = “test”)注解將上述自定義配置文件test.properties中以test開(kāi)頭的屬性值注入到該配置類屬性中。
3、進(jìn)行測(cè)試
@Autowired private MyProperties myProperties; @Test public void myPropertiesTest() { System.out.println(myProperties); }
打印結(jié)果:
使用@Configuration編寫自定義配置類
在Spring Boot框架中,推薦使用配置類的方式向容器中添加和配置組件
在Spring Boot框架中,通常使用@Configuration注解定義一個(gè)配置類,Spring Boot會(huì)自動(dòng)掃描和識(shí)別配置類,從而替換傳統(tǒng)Spring框架中的XML配置文件。
當(dāng)定義一個(gè)配置類后,還需要在類中的方法上使用@Bean注解進(jìn)行組件配置,將方法的返回對(duì)象注入到Spring容器中,并且組件名稱默認(rèn)使用的是方法名,當(dāng)然也可以使用@Bean注解的name或value屬性自定義組件的名稱
演示:
1、新建一個(gè)普通類
在項(xiàng)目下新建一個(gè)com.lagou.config包,并在該包下新創(chuàng)建一個(gè)類MyService,該類中不需要編寫任何代碼
public class MyService { }
創(chuàng)建了一個(gè)空的MyService類,而該類目前沒(méi)有添加任何配置和注解,因此還無(wú)法正常被Spring Boot掃描和識(shí)別
2、新建配置類
在項(xiàng)目的com.lagou.config包下,新建一個(gè)類MyConfig,并使用@Configuration注解將該類聲明一個(gè)配置類,內(nèi)容如下:
@Configuration // 定義該類是一個(gè)配置類```` public class MyConfig { @Bean // 將返回值對(duì)象作為組件添加到Spring容器中,該組件id默認(rèn)為方法名 public MyService myService(){ return new MyService(); } }
MyConfig是@Configuration注解聲明的配置類(類似于聲明了一個(gè)XML配置文件),該配置類會(huì)被Spring Boot自動(dòng)掃描識(shí)別;使用@Bean注解的myService()方法,其返回值對(duì)象會(huì)作為組件添加到了 Spring容器中(類似于XML配置文件中的標(biāo)簽配置),并且該組件的id默認(rèn)是方法名myService
3、測(cè)試類
@Autowired private ApplicationContext applicationContext; @Test public void iocTest() { System.out.println(applicationContext.containsBean("myService")); }
上述代碼中,先通過(guò)@Autowired注解引入了Spring容器實(shí)例ApplicationContext,然后在測(cè)試方法iocTest()中測(cè)試查看該容器中是否包括id為myService的組件。執(zhí)行測(cè)試方法iocTest() ,查看控制臺(tái)輸出效果,結(jié)果如下:
從測(cè)試結(jié)果可以看出,測(cè)試方法iocTest()運(yùn)行成功,顯示運(yùn)行結(jié)果為true,表示Spirng的IOC容器中也已經(jīng)包含了id為myService的實(shí)例對(duì)象組件,說(shuō)明使用自定義配置類的形式完成了向Spring容器進(jìn)行組件的添加和配置
到此這篇關(guān)于一文帶你看懂SpringBoot中的全局配置文件的文章就介紹到這了,更多相關(guān)SpringBoot全局配置文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用springboot單例模式與線程安全問(wèn)題踩的坑
這篇文章主要介紹了使用springboot單例模式與線程安全問(wèn)題踩的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08MyBatis-Flex+ShardingSphere-JDBC多數(shù)據(jù)源分庫(kù)分表實(shí)現(xiàn)
本文介紹了使用MyBatis-Flex和ShardingSphere-JDBC實(shí)現(xiàn)多數(shù)據(jù)源分庫(kù)分表的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-10-10maven自動(dòng)將源碼打包并發(fā)布的實(shí)現(xiàn)步驟
maven-source-plugin 提供項(xiàng)目自動(dòng)將源碼打包并發(fā)布的功能,在需要發(fā)布源碼項(xiàng)目的 pom.xml 文件中添加即可,本文就來(lái)介紹一下如何設(shè)置,感興趣的可以了解一下2023-11-11springboot 注冊(cè)服務(wù)注冊(cè)中心(zk)的兩種方式詳解
本文通過(guò)一個(gè)demo講述一下這兩種注冊(cè)方式,使用的是傳統(tǒng)的向zk注冊(cè)的方案。對(duì)springboot 注冊(cè)zk的相關(guān)知識(shí)感興趣的朋友一起看看吧2018-01-01Spring Boot中slf4j日志依賴關(guān)系示例詳解
在項(xiàng)目開(kāi)發(fā)中,記錄日志是必做的一件事情。而當(dāng)我們使用Springboot框架時(shí),記錄日志就變得極其簡(jiǎn)單了。下面這篇文章主要給大家介紹了關(guān)于Spring Boot中slf4j日志依賴關(guān)系的相關(guān)資料,需要的朋友可以參考下2018-11-11springboot 自定義LocaleResolver實(shí)現(xiàn)切換語(yǔ)言
我們?cè)谧鲰?xiàng)目的時(shí)候,往往有很多項(xiàng)目需要根據(jù)用戶的需要來(lái)切換不同的語(yǔ)言,使用國(guó)際化就可以輕松解決。這篇文章主要介紹了springboot 自定義LocaleResolver切換語(yǔ)言,需要的朋友可以參考下2019-10-10jpa使用uuid策略后無(wú)法手動(dòng)設(shè)置id的問(wèn)題及解決
這篇文章主要介紹了jpa使用uuid策略后無(wú)法手動(dòng)設(shè)置id的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08