一文帶你看懂SpringBoot中的全局配置文件
全局配置文件能夠?qū)σ恍┠J配置值進行修改。
Spring Boot使用一個application.properties或者application.yaml的文件作為全局配置文件,該文件存放在src/main/resource目錄或者類路徑的/config,一般會選擇resource目錄。
接下來,將針對這兩種全局配置文件進行講解 :
Spring Boot配置文件的命名及其格式:
- application.properties
- application.yaml
- application.yml
1.application.properties配置文件
使用Spring Initializr方式構(gòu)建Spring Boot項目時,會在resource目錄下自動生成一個空的application.properties文件,Spring Boot項目啟動時會自動加載application.properties文件。
我們可以在application.properties文件中定義Spring Boot項目的相關(guān)屬性
當然,這些相關(guān)屬性可以是系統(tǒng)屬性、環(huán)境變量、命令參數(shù)等信息,也可以是自定義配置文件名稱和位置
#修改tomcat的版本號 server.port=8888 #定義數(shù)據(jù)庫的連接信息 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
接下來,通過一個案例對Spring Boot項目application.properties配置文件的具體使用進行講解 演示:
預先準備了兩個實體類文件,后續(xù)會演示application.properties配置文件中的自定義配置屬性注入到Person實體類的對應屬性中
創(chuàng)建實體類
先在項目的com.lagou包下創(chuàng)建一個pojo包,并在該包下創(chuàng)建兩個實體類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; //愛好
private String[] family; //家庭成員
private Map map;
private Pet pet; //寵物
}@ConfigurationProperties(prefix = “person”)注解的作用是將配置文件中以person開頭的屬性值通過setXX()方法注入到實體類對應屬性中@Component注解的作用是將當前注入屬性值的Person類對象作為Bean組件放到Spring容器中,只有這樣@ConfigurationProperties注解進行賦值
打開項目的resources目錄
打開項目的resources目錄下的application.properties配置文件,在該配置文件中編寫需要對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配置文件是否正確
同時查看屬性配置效果,打開通過IDEA工具創(chuàng)建的項目測試類,在該測試類中引入Person實體類Bean,并進行輸出測試
@RunWith(SpringRunner.class) // 測試啟動器,并加載Spring Boot測試注解
@SpringBootTest // 標記為Spring Boot單元測試類,并加載項目的ApplicationContext上下文環(huán)
境
class SpringbootDemoApplicationTests {
// 配置測試
@Autowired
private Person person;
@Test
void configurationTest() {
System.out.println(person);
}
}打印結(jié)果:

可以看出,測試方法configurationTest()運行成功,同時正確打印出了Person實體類對象。至此,說明application.properties配置文件屬性配置正確,并通過相關(guā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ù)據(jù)序列化格式。application.yaml配置文件的 工作原理和application.properties是一樣的,只不過yaml格式配置文件看起來更簡潔一些。
YAML文件的擴展名可以使用.yml或者.yaml。
application.yml文件使用 “key:(空格)value”格式配置屬性,使用縮進控制層級關(guān)系。
SpringBoot的三種配置文件是可以共存的:

這里,針對不同數(shù)據(jù)類型的屬性值,介紹一下YAML
value值為普通數(shù)據(jù)類型
value值為普通數(shù)據(jù)類型(例如數(shù)字、字符串、布爾等)
當YAML配置文件中配置的屬性值為普通數(shù)據(jù)類型時,可以直接配置對應的屬性值,同時對于字符串類型的屬性值,不需要額外添加引號,示例代碼如下
server: port: 8080 servlet: context-path: /hello
value值為數(shù)組和單列集合
當YAML配置文件中配置的屬性值為數(shù)組或單列集合類型時,主要有兩種書寫方式:縮進式寫法和行內(nèi)式寫法。
其中,縮進式寫法還有兩種表示形式,示例代碼如下
person: hobby: - play - read - sleep
或者使用如下示例形式
person: hobby: play, read, sleep
上述代碼中,在YAML配置文件中通過兩種縮進式寫法對person對象的單列集合(或數(shù)組)類型的愛好hobby賦值為play、read和sleep。其中一種形式為“-(空格)屬性值”,另一種形式為多個屬性值之前加英文逗號分隔(注意,最后一個屬性值后不要加逗號)。
person: hobby: [play,read,sleep]
通過上述示例對比發(fā)現(xiàn),YAML配置文件的行內(nèi)式寫法更加簡明、方便。另外,包含屬性值的中括號“[]”還可以進一步省略,在進行屬性賦值時,程序會自動匹配和校對
value值為Map集合和對象
當YAML配置文件中配置的屬性值為Map集合或?qū)ο箢愋蜁r,YAML配置文件格式同樣可以分為兩種書寫方式:縮進式寫法和行內(nèi)式寫法。
其中,縮進式寫法的示例代碼如下
person: map: k1: v1 k2: v2
對應的行內(nèi)式寫法示例代碼如下
person:
map: {k1: v1,k2: v2}在YAML配置文件中,配置的屬性值為Map集合或?qū)ο箢愋蜁r,縮進式寫法的形式按照YAML文件格式編寫即可,而行內(nèi)式寫法的屬性值要用大括號“{}”包含。
接下來,在Properties配置文件演示案例基礎(chǔ)上,通過配置application.yaml配置文件對Person對象進行賦值,具體使用如下
(1)在項目的resources目錄下,新建一個application.yaml配置文件,在該配置文件中編寫為Person類設(shè)置的配置屬性
#對實體類對象Person進行屬性配置 person: id: 1 name: 王二麻子 family: - 妻 - 妾 hobby: - play - read - sleep map: k1: value1 k2: value2 pet: type: 狗 name: 哈士奇
(2)再次執(zhí)行測試結(jié)果
Person{
id=1,
name='王二麻子',
hobby=[play, read, sleep],
family=[妻, 妾],
map={k1=value1,k2=value2},
pet=Pet{type='狗', name='哈士奇'}
}可以看出,測試方法configurationTest()同樣運行成功,并正確打印出了Person實體類對象。
需要說明的是,本次使用application.yaml配置文件進行測試時需要提前將application.properties配置文件中編寫的配置注釋,這是因為application.properties配置文件會覆蓋application.yaml配置文件
3. 配置文件屬性值的注入
配置文件的優(yōu)先級如下: 從低到高
<includes>
<include>**/application*.yml</include>
<include>**/application*.yaml</include>
<include>**/application*.properties</include>
</includes使用Spring Boot全局配置文件設(shè)置屬性時:
如果配置屬性是Spring Boot已有屬性,例如服務端server.port,那么Spring Boot內(nèi)部會自動掃描并讀取這些配置文件中的屬性值并覆蓋默認屬性。
如果配置的屬性是用戶自定義屬性,例如剛剛自定義的Person實體類屬性,還必須在程序中注入這些配置屬性方可生效。
Spring Boot支持多種注入配置文件屬性的方式,下面來介紹如何使用注解@ConfigurationProperties和@Value注入屬性
4. 使用@ConfigurationProperties注入屬性
Spring Boot提供的@ConfigurationProperties注解用來快速、方便地將配置文件中的自定義屬性值批量注入到某個Bean對象的多個對應屬性中。
假設(shè)現(xiàn)在有一個配置文件,如果使用 @ConfigurationProperties注入配置文件的屬性,示例代碼如下:
@Data
@Component
//將配置文件中所有以person開頭的配置信息注入當前類中
//前提1:必須保證配置文件中person.xx與當前Person類的屬性名一致
//前提2:必須保證當前Person中的屬性都具有set方法
@ConfigurationProperties(prefix = "person")
public class Person {
private int id; //id
private String name; //名稱
private List hobby; //愛好
private String[] family; //家庭成員
private Map map;
private Pet pet; //寵物
}上述代碼使用@Component和@ConfigurationProperties(prefix = “person”)將配置文件中的每個屬性映射到person類組件中。
5. 使用@Value注入屬性
@Value注解是Spring框架提供的,用來讀取配置文件中的屬性值并逐個注入到Bean對象的對應屬性中,Spring Boot框架從Spring框架中對@Value注解進行了默認繼承,所以在Spring Boot框架中還可以 使用該注解讀取和注入配置文件屬性值。使用@Value注入屬性的示例代碼如下
@Component
public class Person {
@Value("${person.id}")
private int id;
}上述代碼中,使用@Component和@Value注入Person實體類的id屬性。其中,@Value不僅可以將配置文件的屬性注入Person的id屬性,還可以直接給id屬性賦值,這點是@ConfigurationProperties不支持的
演示@Value注解讀取并注入配置文件屬性的使用:
創(chuàng)建實體類
在com.lagou.pojo包下新創(chuàng)建一個實體類Student,并使用@Value注解注入屬性
@Component
public class Student {
@Value("${person.id}")
private int id;
@Value("${person.name}")
private String name; //名稱
//省略toString
}Student類使用@Value注解將配置文件的屬性值讀取和注入。 從上述示例代碼可以看出,使用@Value注解方式需要對每一個屬性注入設(shè)置,同時又免去了屬性的setXX()方法
再次打開測試類進行測試
@Autowired
private Student student;
@Test
public void studentTest() {
System.out.println(student);
}打印結(jié)果:

可以看出,測試方法studentTest()運行成功,同時正確打印出了Student實體類對象。需要說明的是,本示例中只是使用@Value注解對實例中Student對象的普通類型屬性進行了賦值演示,而@Value注 解對于包含Map集合、對象以及YAML文件格式的行內(nèi)式寫法的配置文件的屬性注入都不支持,如果賦值會出現(xiàn)錯誤.
6. 自定義配置
spring Boot免除了項目中大部分的手動配置,對于一些特定情況,我們可以通過修改全局配置文件以適應具體生產(chǎn)環(huán)境,可以說,幾乎所有的配置都可以寫在application.yml文件中,Spring Boot會自 動加載全局配置文件從而免除我們手動加載的煩惱。
但是,如果我們自定義配置文件,Spring Boot是無法識別這些配置文件的,此時就需要我們手動加載。接下來,將針對Spring Boot的自定義配置文件及其加載方式進行講解
使用@PropertySource加載配置文件
對于這種加載自定義配置文件的需求,可以使用@PropertySource注解來實現(xiàn)。@PropertySource注解用于指定自定義配置文件的具體位置和名稱
當然,如果需要將自定義配置文件中的屬性值注入到對應類的屬性中,可以使用@ConfigurationProperties或者@Value注解進行屬性值注入
演示:
1、新建一個配置文件
打開Spring Boot項目的resources目錄,在項目的類路徑下新建一個test.properties自定義配置文件,在該配置文件中編寫需要設(shè)置的配置屬性
#對實體類對象MyProperties進行屬性配置 test.id=110 test.name=test
2、創(chuàng)建一個配置類MyProperties
在com.lagou.pojo包下新創(chuàng)建一個配置類MyProperties,提供test.properties自定義配置文件中對應的屬性,并根據(jù)@PropertySource注解的使用進行相關(guān)配置
@Component // 自定義配置類
@PropertySource("classpath:test.properties") // 指定自定義配置文件位置和名稱
@ConfigurationProperties(prefix = "test") // 指定配置文件注入屬性前綴
public class MyProperties {
private int id;
private String name;
// 省略屬性getXX()和setXX()方法
// 省略toString()方法
}主要是一個自定義配置類,通過相關(guān)注解引入了自定義的配置文件,并完成了自定義屬性值的注入。針對示例中的幾個注解,具體說明如下
- @PropertySource(“classpath:test.properties”)注解指定了自定義配置文件的位置和名稱,此示例表示自定義配置文件為classpath類路徑下的test.properties文件;
- @ConfigurationProperties(prefix = “test”)注解將上述自定義配置文件test.properties中以test開頭的屬性值注入到該配置類屬性中。
3、進行測試
@Autowired
private MyProperties myProperties;
@Test
public void myPropertiesTest() {
System.out.println(myProperties);
}打印結(jié)果:

使用@Configuration編寫自定義配置類
在Spring Boot框架中,推薦使用配置類的方式向容器中添加和配置組件
在Spring Boot框架中,通常使用@Configuration注解定義一個配置類,Spring Boot會自動掃描和識別配置類,從而替換傳統(tǒng)Spring框架中的XML配置文件。
當定義一個配置類后,還需要在類中的方法上使用@Bean注解進行組件配置,將方法的返回對象注入到Spring容器中,并且組件名稱默認使用的是方法名,當然也可以使用@Bean注解的name或value屬性自定義組件的名稱
演示:
1、新建一個普通類
在項目下新建一個com.lagou.config包,并在該包下新創(chuàng)建一個類MyService,該類中不需要編寫任何代碼
public class MyService {
}創(chuàng)建了一個空的MyService類,而該類目前沒有添加任何配置和注解,因此還無法正常被Spring Boot掃描和識別
2、新建配置類
在項目的com.lagou.config包下,新建一個類MyConfig,并使用@Configuration注解將該類聲明一個配置類,內(nèi)容如下:
@Configuration // 定義該類是一個配置類````
public class MyConfig {
@Bean // 將返回值對象作為組件添加到Spring容器中,該組件id默認為方法名
public MyService myService(){
return new MyService();
}
}MyConfig是@Configuration注解聲明的配置類(類似于聲明了一個XML配置文件),該配置類會被Spring Boot自動掃描識別;使用@Bean注解的myService()方法,其返回值對象會作為組件添加到了 Spring容器中(類似于XML配置文件中的標簽配置),并且該組件的id默認是方法名myService
3、測試類
@Autowired
private ApplicationContext applicationContext;
@Test
public void iocTest() {
System.out.println(applicationContext.containsBean("myService"));
}上述代碼中,先通過@Autowired注解引入了Spring容器實例ApplicationContext,然后在測試方法iocTest()中測試查看該容器中是否包括id為myService的組件。執(zhí)行測試方法iocTest() ,查看控制臺輸出效果,結(jié)果如下:

從測試結(jié)果可以看出,測試方法iocTest()運行成功,顯示運行結(jié)果為true,表示Spirng的IOC容器中也已經(jīng)包含了id為myService的實例對象組件,說明使用自定義配置類的形式完成了向Spring容器進行組件的添加和配置
到此這篇關(guān)于一文帶你看懂SpringBoot中的全局配置文件的文章就介紹到這了,更多相關(guān)SpringBoot全局配置文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MyBatis-Flex+ShardingSphere-JDBC多數(shù)據(jù)源分庫分表實現(xiàn)
本文介紹了使用MyBatis-Flex和ShardingSphere-JDBC實現(xiàn)多數(shù)據(jù)源分庫分表的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-10-10
maven自動將源碼打包并發(fā)布的實現(xiàn)步驟
maven-source-plugin 提供項目自動將源碼打包并發(fā)布的功能,在需要發(fā)布源碼項目的 pom.xml 文件中添加即可,本文就來介紹一下如何設(shè)置,感興趣的可以了解一下2023-11-11
springboot 注冊服務注冊中心(zk)的兩種方式詳解
本文通過一個demo講述一下這兩種注冊方式,使用的是傳統(tǒng)的向zk注冊的方案。對springboot 注冊zk的相關(guān)知識感興趣的朋友一起看看吧2018-01-01
Spring Boot中slf4j日志依賴關(guān)系示例詳解
在項目開發(fā)中,記錄日志是必做的一件事情。而當我們使用Springboot框架時,記錄日志就變得極其簡單了。下面這篇文章主要給大家介紹了關(guān)于Spring Boot中slf4j日志依賴關(guān)系的相關(guān)資料,需要的朋友可以參考下2018-11-11
springboot 自定義LocaleResolver實現(xiàn)切換語言
我們在做項目的時候,往往有很多項目需要根據(jù)用戶的需要來切換不同的語言,使用國際化就可以輕松解決。這篇文章主要介紹了springboot 自定義LocaleResolver切換語言,需要的朋友可以參考下2019-10-10
jpa使用uuid策略后無法手動設(shè)置id的問題及解決
這篇文章主要介紹了jpa使用uuid策略后無法手動設(shè)置id的問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08

