引言
了解SpringBoot
配置文件的加載順序,對項目的開發和部署會有很大的幫助,不同環境加載不同的配置文件,不必再修改配置文件。
springboot配置文件加載順序
1、項目內配置文件加載順序
SpringBoot項目啟動會掃描以下位置的application.properties或者application.yml文件作為SpringBoot的默認配置文件,具體的目錄位置見下圖。
file:./config/ ( 項目根路徑下的config文件夾)
file:./ (項目根路徑)
classpath:/config/ (類路徑下的config文件夾)
classpath:/ (類路徑)
啟動項目可看到使用的8080端口,最優先使用的配置文件./config/ ( 項目根路徑下的config文件夾)
把8080的配置文件注釋掉,再啟動項目
可看到使用的8083端口,使用的file:./ (項目根路徑)的配置文件
再把該配置文件注釋掉,再啟動項目
這次使用的是8081端口,使用的是classpath:/config/ (類路徑下的config文件夾)的配置文件
再將該配置文件注釋掉,再次啟動項目
可以看到這次使用的是classpath:/ (類路徑)下配置文件
上面四個位置的配置文件位置,優先級由高到底,高優先級的配置會覆蓋低優先級的配置,沒有的配置進行互補配置。
最后將項目打包為jar包,並將該jar包解壓縮后查看上述四個配置文件:
jar包中只發現兩個在類路徑下的application.yml配置文件,不是類路徑下的配置文件在打包時,如果不做配置是不會打包進jar中的,也會是說前兩個配置在項目打包后,包中是不存在的,所以盡量不要用前兩個位置。
2、外部配置文件
當把項目打包后,如何在配置SpringBoot項目呢
(1)命令行參數
項目打包好以后,可以使用命令行參數的形式,來改變想改變的幾個參數,直接在啟動命令后添加啟動參數,如果有多個配置項,可以用空格分開。
java -jar demo-0.0.1-SNAPSHOT.jar --server.port=8088 --server.servlet.context-path=/api
啟動項目時在命令行添加指定的生效配置參數,可以看到配置的8088端口已經生效了。
(2)外置配置文件
如果需要配置的參數較多,使用命令行添加參數的方式就容易出錯且繁瑣了,可以將要使用的參數都寫在配置文件中,啟動項目的時候可以用spring.config.location
來指定配置文件的新位置。指定的配置文件和jar包中默認加載的配置文件共同起作用形成互補配置。
啟用項目時使用E盤下的application.yml配置文件,在該配置文件中指定端口號8089
可看到指定外置配置文件中的端口8089已經生效,指定的配置文件和jar包中默認加載的配置文件共同起作用形成互補配置。
(3)配置文件加載順序小結
外部配置加載順序SpringBoot也可以從以下位置加載配置:
優先級從高到低,高優先級的配置覆蓋低優先級的配置,所有的配置會形成互補配置 。
- 命令行參數。所有的配置都可以在命令行上進行指定;
- 來自java:comp/env的JNDI屬性;
- Java系統屬性(System.getProperties());
- 操作系統環境變量 ;
- jar包外部的application-{profile}.properties或application.yml(帶spring.profile)配置文件
- jar包內部的application-{profile}.properties或application.yml(帶spring.profile)配置文件,再來加載不帶profile
- jar包外部的application.properties或application.yml(不帶spring.profile)配置文件
- jar包內部的application.properties或application.yml(不帶spring.profile)配置文件
- @Configuration注解類上的@PropertySource
根據第7條,只要在jar包同目錄外放置一個application.properties配置文件,就會起作用,同時這個配置文件的優先級還比jar內的高,這個配置十分有用。
在jar包同路徑下放置一個配置了端口號為8087的application.yml再次啟動項目
可以看到8087端口已經生效了,而且比在jar包里的application.yml中配置的優先級高。
當然springboot官方推出的配置方式比上述的全面,具體可參考springboot官網講述的配置文件加載順序