SpringBoot獲取配置文件的簡單實(shí)現(xiàn)方法
前言

在講SpringBoot 獲取配置文件之前我們需要對SpringBoot 的項(xiàng)目有一個(gè)整體的了解,如何創(chuàng)建SpringBoot 項(xiàng)目,項(xiàng)目結(jié)構(gòu)等等知識點(diǎn),我在這里就不一一講述了,沒有學(xué)過的小伙伴可以自己在網(wǎng)上找一些資料進(jìn)行學(xué)習(xí),很簡單的。
下面讓我們開始今天的內(nèi)容講解吧。
一、SpringBoot 全局配置文件的加載順序
在SpringBoot 當(dāng)中,全局配置文件有兩種不同的格式,一個(gè)是我們常見的properties, 一種是yml.
這兩種格式的文件其實(shí)也沒什么太大的區(qū)別,使用的時(shí)候按照個(gè)人的習(xí)慣來就行,下面我們用的是yml文件。
首先,當(dāng)我們創(chuàng)建SpringBoot 的項(xiàng)目時(shí),默認(rèn)在resources目錄下創(chuàng)建一個(gè)application.properties文件,這時(shí)我們可以在
這個(gè)文件當(dāng)中對項(xiàng)目進(jìn)行配置即可。但是在SpringBoot 中application.properties可以存放在以下幾個(gè)位置:
file:./config/ 項(xiàng)目根目錄下的config文件夾下
file:./ 項(xiàng)目根目錄下
classpath:/config/ 類路徑下的config文件夾下
classpath:/ 類路徑下
文件的加載順序:即根目錄下的config目錄下,然后是 根目錄下,然后是classpath路徑下的config目錄下,最后是classpath路徑下。

優(yōu)先級由高到低,高優(yōu)先級的配置會(huì)覆蓋低優(yōu)先級的配置。
假如:根目錄下的config目錄下定義端口為8084, 根目錄下定義端口為8083 ,classpath路徑下的config目錄定義端口為8082,classpath路徑下定義端口為8081,最后啟動(dòng),啟動(dòng)的端口為8084 ,高優(yōu)先級會(huì)覆蓋低優(yōu)先級。
注意: 并不是高優(yōu)先級的被加載了,低優(yōu)先級的就不會(huì)再加載,實(shí)際上是SpringBoot會(huì)從這四個(gè)位置全部加載主配置文件,并且還能產(chǎn)生互相配置的效果。
除此外,我們還可以通過spring.config.location來改變默認(rèn)的配置文件位置。
項(xiàng)目打包好以后,我們可以使用命令行參數(shù)的形式,啟動(dòng)項(xiàng)目的時(shí)候來指定配置文件的新位置;指定默認(rèn)加載的這些配置文件共同起作用形成互補(bǔ)配置。
在 G盤目錄下,創(chuàng)建一個(gè)application.yml文件,定義端口為8085
打包項(xiàng)目,啟動(dòng)命令行:java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --spring.config.location=G:/application.yml 回車運(yùn)行。
外部配置加載順序
1、命令行參數(shù)
eg: java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --server.port=8087
---- 由jar包外向jar包內(nèi)進(jìn)行尋找:
2、 優(yōu)先加載帶profile
jar包外部的 application-{profile}.properties或application.yml(帶spring.profile)配置文件
將打好的jar包放在一個(gè)目錄下,然后再該文件夾下新建一個(gè)名為application.yml的文件,其中指定
port為8082 ,訪問路徑為/boot ,然后命令行直接啟動(dòng)項(xiàng)目。java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --application.yml

在講配置文件之前,我先說一說yml文件配置信息書寫格式
基本數(shù)據(jù)類型(8種基本數(shù)據(jù)類型)以k: v 形式書寫即可
比如我在一個(gè)實(shí)體類(Person)中定義一個(gè) 屬性(age),類型是 int ,在yml文件中的書寫格式如下
person: age: 20
實(shí)體類對象(Person),Map ,k:v 在下一行來寫對象的屬性和值的關(guān)系,注意縮進(jìn)
person: userName: zhans age: 20
#另一種行內(nèi)寫法
person: {userName: zhans.age: 20}
List ,數(shù)組的書寫,注意 - 后有空格
pets: - cat - dog - pig
#另一種行內(nèi)寫法
pets:{cat,dog,pi}
二、SpringBoot 獲取配置文件的方式
**@Value **
創(chuàng)建配置類,由于篇幅問題這里省略了 setter、getter 方法,但是實(shí)際開發(fā)中這個(gè)是必須的,否則無法成功注入,@Component表示把當(dāng)前配置類注入到Spring容器當(dāng)中。
@Component
public class PersonConfig {
@Value("${person.userName}")
private String userName;
@Value("${person.age}")
private int age;
}
在主配置文件中添加如下配置(application.yml)
server: port: 8081 person: userName: hello age: 20
測試類:
@RestController
public class PersonController {
@Autowired
private Person person;
@RequestMapping(value = "/get",method = RequestMethod.GET)
public String findPerson(){
return "姓名:"+person.getUserName()+"年齡:"+person.getAge();
}
}
啟動(dòng)項(xiàng)目,訪問地址http://localhost:8080/get運(yùn)行結(jié)果:
姓名:hello年齡:20
所以,我們就可以通過 @Value(${key})的方式獲取全局配置文件中的指定配置項(xiàng)。
@ConfigurationProperties
如果我們需要取 許多個(gè)配置項(xiàng),通過 @Value 的方式去配置項(xiàng)需要一個(gè)一個(gè)去取,顯然有點(diǎn)麻煩。所以我們可以使用 @ConfigurationProperties。
標(biāo)有 @ConfigurationProperties的類的所有屬性和配置文件中相關(guān)的配置項(xiàng)進(jìn)行綁定,綁定之后我們就可以通過這個(gè)類去訪問全局配置文件中的屬性值。
代碼實(shí)例如下:
1、在主配置文件中添加如下配置
user:
username: admin
password: 123456
map: {k1: v1,k2: v2}
list:
- cat
- dog
person:
userName: hello
age: 20
objects:
- aaa
- bbb
- ccc
創(chuàng)建配置類,由于篇幅問題這里省略了 setter、getter ,toString 方法,但是實(shí)際開發(fā)中這個(gè)是必須的,否則無法成功注入。
@Component
@ConfigurationProperties(prefix = "user")
public class User {
private String username;
private String password;
private Map<String,String> map;
private Person person;
private List<String> list;
private Object[] objects;
}
這里 @ConfigurationProperties 有一個(gè) prefix參數(shù),主要是用來指定該配置項(xiàng)在配置文件中的前綴,即user。
測試類
@RestController
public class PersonController {
@Autowired
private Person person;
@RequestMapping(value = "/findUser",method = RequestMethod.GET)
public String findUser(){
return user.toString();
}
}
我們在頁面訪問 http://localhost:8081/findUser,頁面就顯示我們在yml文件中配置的信息了。
User{username='admin', password='123456', map={k1=v1, k2=v2}, person=com.zfcoding.config.Person@93471e6, list=[cat, dog], objects=[aaa, bbb, ccc]}
以上的兩種方式有什么區(qū)別呢?
| @ConfigurationProperties | @Value | |
|---|---|---|
| 功能 | 批量注入配置文件的屬性 | 一個(gè)一個(gè)指定 |
| 松散綁定 | 支持 | 不支持 |
| JSR303數(shù)據(jù)校驗(yàn) | 支持 | 不支持 |
| 復(fù)雜數(shù)據(jù)封裝 | 支持 | 不支持(Map) |
松散綁定,username 可以用user-name 表示,來獲取值
JSR303數(shù)據(jù)校驗(yàn),如果用@Value獲取全局配置文件的屬性,使用@Validated文件格式校驗(yàn)是不起作用的。
@PropertySource 注解加載指定的配置文件。
@PropertySource (value = “ ”) 指明加載類路徑下的哪個(gè)配置文件來注入值
創(chuàng)建配置類,由于篇幅問題這里省略了 setter、getter ,toString 方法,但是實(shí)際開發(fā)中這個(gè)是必須的,否則無法成功注入。
@Component
@PropertySource( "classpath:student.properties")
@ConfigurationProperties(prefix = "student")
public class Student {
private String sname;
}
在student.properties文件中添加如下配置
student.sname=admin
測試類
@SpringBootTest
class SpringbootExampleApplicationTests {
@Autowired
private DogConfig dogConfig;
@Test
void contextLoads() {
System.out.println("注入的對象:"+dogConfig.getName());
}
}
運(yùn)行結(jié)果:
Student{sname='admin'}
@ImportResource 導(dǎo)入Spring 配置文件
@ImportResource 注解用來導(dǎo)入 Spring 的配置文件,如果Spring配置文件 "bean.xml",從而讓配置文件里面的內(nèi)容生效,通??梢园袬ImportResource標(biāo)注在@SpringBootApplication的啟動(dòng)類上即可。
舉例說明:比如我們把PersonService注入到Spring容器當(dāng)中,通過Spring配置文件的方式操作,代碼示例如下:
public class PersonService {
}
@ImportResource("classpath:bean.xml")
@SpringBootApplication
public class SpringBootConfigApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootConfigApplication.class, args);
}
}
Spring的配置文件:bean.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="personService" class="com.zfcoding.service.PersonService"></bean> </beans>
測試的案例:
@SpringBootTest
class SpringBootConfigApplicationTests {
@Autowired
private PersonService personSerivcer;
@Test
void contextLoads() {
System.out.println("注入的對象:"+personSerivcer);
}
}
運(yùn)行的結(jié)果:
這Spring 中bean的配置實(shí)現(xiàn),但是SpringBoot 推薦我們使用注解開發(fā),那Springboot 中注解是如何實(shí)現(xiàn)bean 的注入呢?
@Configuration:指明當(dāng)前類是配置類,就是代替上面說到的spring的配置文件.
@Bean 將方法返回值添加到容器當(dāng)中,容器中這個(gè)組件默認(rèn)的id 是方法名
@Configuration
public class MyConfig {
@Bean
public PersonSerivcer personSerivcer(){
return new PersonSerivcer();
}
}
這樣就可以就可以通過注解實(shí)現(xiàn)代替Spring 中的配置文件了。
三、SpringBoot 的Profile
我們這里就以yml文件為例
第一種是我在 主配置文件編寫的時(shí)候,文件名可以是application-{profile}.yml(application-dev.yml, application-prod.yml),默認(rèn)使用 文件application.yml 的配置
1、如果我們想要使用的application-dev.yml 全局配置文件,在application.yml 指定即可。
配置實(shí)例:
在application.yml 配置文件中添加如下配置
spring: profiles: active: dev
在application-dev.ym 配置文件中添加如下配置l
server: port: 8080 #應(yīng)用訪問的項(xiàng)目路徑 servlet: context-path: /boot person: username: 占山
2、yml支持多文檔快方式
那么,在application-dev.ym 配置文件中添加如下配置l
spring: profiles: active: prod --- server: port: 8080 servlet: context-path: /zf spring: profiles: dev --- person: userName: 啊哈 server: port: 8081 servlet: context-path: /boot spring: profiles: prod
3、Program arguments
在Program arguments中配置參數(shù)
--spring.profiles.active=dev

4、虛擬機(jī)的方式
在VM options下使用命令:-Dspring.profiles.active=prod

四、小結(jié)
實(shí)際開發(fā)中我們?nèi)绻绻覀冃枰?許多個(gè)配置項(xiàng),就使用@ConfigurationProperties注解,如果只是注入一個(gè)屬性就使用@Value,
@PropertySource 注解加載指定的配置文件,@ImportResource 導(dǎo)入Spring 配置文件(這里可以使用注解來替代)。
到此這篇關(guān)于SpringBoot獲取配置文件的簡單實(shí)現(xiàn)方法就介紹到這了,更多相關(guān)SpringBoot獲取配置文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringCloud集成Eureka并實(shí)現(xiàn)負(fù)載均衡的過程詳解
這篇文章主要給大家詳細(xì)介紹了SpringCloud集成Eureka并實(shí)現(xiàn)負(fù)載均衡的過程,文章通過代碼示例和圖文講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的參考價(jià)值,需要的朋友可以參考下2023-11-11
SpringBoot3整合SpringCloud啟動(dòng)后nacos報(bào)錯(cuò)獲取不到配置、無法注冊服務(wù)的解決方案
文章介紹了如何使用Spring Boot 3.3.4和Spring Cloud 2023.0.3搭建微服務(wù)項(xiàng)目,并解決與Nacos服務(wù)注冊發(fā)現(xiàn)和配置中心的集成問題,主要解決了依賴版本不兼容、配置文件導(dǎo)入問題及服務(wù)注冊失敗等問題,感興趣的朋友跟隨小編一起看看吧2025-02-02
SpringBootTest單元測試報(bào)錯(cuò)的解決方案
這篇文章主要介紹了SpringBootTest單元測試報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Spring MVC 更靈活的控制 json 返回問題(自定義過濾字段)
本篇文章主要介紹了Spring MVC 更靈活的控制 json 返回問題(自定義過濾字段),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02

