您好,登錄后才能下訂單哦!
小編這次要給大家分享的是SpringBoot如何獲取配置文件,文章內容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。
前言
在講SpringBoot 獲取配置文件之前我們需要對SpringBoot 的項目有一個整體的了解,如何創建SpringBoot 項目,項目結構等等知識點,我在這里就不一一講述了,沒有學過的小伙伴可以自己在網上找一些資料進行學習,很簡單的。
下面讓我們開始今天的內容講解吧。
一、SpringBoot 全局配置文件的加載順序
在SpringBoot 當中,全局配置文件有兩種不同的格式,一個是我們常見的properties, 一種是yml.
這兩種格式的文件其實也沒什么太大的區別,使用的時候按照個人的習慣來就行,下面我們用的是yml文件。
首先,當我們創建SpringBoot 的項目時,默認在resources目錄下創建一個application.properties文件,這時我們可以在
這個文件當中對項目進行配置即可。但是在SpringBoot 中application.properties可以存放在以下幾個位置:
file:./config/ 項目根目錄下的config文件夾下
file:./ 項目根目錄下
classpath:/config/ 類路徑下的config文件夾下
classpath:/ 類路徑下
文件的加載順序:即根目錄下的config目錄下,然后是 根目錄下,然后是classpath路徑下的config目錄下,最后是classpath路徑下。
優先級由高到低,高優先級的配置會覆蓋低優先級的配置。
假如:根目錄下的config目錄下定義端口為8084, 根目錄下定義端口為8083 ,classpath路徑下的config目錄定義端口為8082,classpath路徑下定義端口為8081,最后啟動,啟動的端口為8084 ,高優先級會覆蓋低優先級。
注意: 并不是高優先級的被加載了,低優先級的就不會再加載,實際上是SpringBoot會從這四個位置全部加載主配置文件,并且還能產生互相配置的效果。
除此外,我們還可以通過spring.config.location來改變默認的配置文件位置。
項目打包好以后,我們可以使用命令行參數的形式,啟動項目的時候來指定配置文件的新位置;指定默認加載的這些配置文件共同起作用形成互補配置。
在 G盤目錄下,創建一個application.yml文件,定義端口為8085
打包項目,啟動命令行:java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --spring.config.location=G:/application.yml
回車運行。
外部配置加載順序
1、命令行參數
eg: java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --server.port=8087
---- 由jar包外向jar包內進行尋找:
​ 2、 優先加載帶profile
jar包外部的 application-{profile}.properties
或application.yml(帶spring.profile)配置文件
將打好的jar包放在一個目錄下,然后再該文件夾下新建一個名為application.yml
的文件,其中指定
port為8082 ,訪問路徑為/boot ,然后命令行直接啟動項目。java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --application.yml
在講配置文件之前,我先說一說yml文件配置信息書寫格式
基本數據類型(8種基本數據類型)以k: v 形式書寫即可
比如我在一個實體類(Person)中定義一個 屬性(age),類型是 int ,在yml文件中的書寫格式如下
person: age: 20
實體類對象(Person),Map ,k:v 在下一行來寫對象的屬性和值的關系,注意縮進
person: userName: zhans age: 20
#另一種行內寫法 person: {userName: zhans.age: 20}
List ,數組的書寫,注意 - 后有空格
pets: - cat - dog - pig
#另一種行內寫法 pets:{cat,dog,pi}
二、SpringBoot 獲取配置文件的方式
**@Value **
創建配置類,由于篇幅問題這里省略了 setter、getter 方法,但是實際開發中這個是必須的,否則無法成功注入,@Component表示把當前配置類注入到Spring容器當中。
@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(); } }
啟動項目,訪問地址http://localhost:8080/get運行結果:
姓名:hello年齡:20
所以,我們就可以通過 @Value(${key})的方式獲取全局配置文件中的指定配置項。
@ConfigurationProperties
如果我們需要取 許多個配置項,通過 @Value 的方式去配置項需要一個一個去取,顯然有點麻煩。所以我們可以使用 @ConfigurationProperties。
標有 @ConfigurationProperties的類的所有屬性和配置文件中相關的配置項進行綁定,綁定之后我們就可以通過這個類去訪問全局配置文件中的屬性值。
代碼實例如下:
1、在主配置文件中添加如下配置
user: username: admin password: 123456 map: {k1: v1,k2: v2} list: - cat - dog person: userName: hello age: 20 objects: - aaa - bbb - ccc
創建配置類,由于篇幅問題這里省略了 setter、getter ,toString 方法,但是實際開發中這個是必須的,否則無法成功注入。
@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 有一個 prefix參數,主要是用來指定該配置項在配置文件中的前綴,即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]}
以上的兩種方式有什么區別呢?
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件的屬性 | 一個一個指定 |
松散綁定 | 支持 | 不支持 |
JSR303數據校驗 | 支持 | 不支持 |
復雜數據封裝 | 支持 | 不支持(Map) |
松散綁定,username 可以用user-name 表示,來獲取值
JSR303數據校驗,如果用@Value獲取全局配置文件的屬性,使用@Validated文件格式校驗是不起作用的。
@PropertySource 注解加載指定的配置文件。
​ @PropertySource (value = “ ”) 指明加載類路徑下的哪個配置文件來注入值
創建配置類,由于篇幅問題這里省略了 setter、getter ,toString 方法,但是實際開發中這個是必須的,否則無法成功注入。
@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()); } }
運行結果:
Student{sname='admin'}
@ImportResource 導入Spring 配置文件
@ImportResource 注解用來導入 Spring 的配置文件,如果Spring配置文件 "bean.xml",從而讓配置文件里面的內容生效,通常可以把@ImportResource標注在@SpringBootApplication的啟動類上即可。
舉例說明:比如我們把PersonService注入到Spring容器當中,通過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); } }
運行的結果:
注入的對象:com.zfcoding.service.PersonService@5b84f14
這Spring 中bean的配置實現,但是SpringBoot 推薦我們使用注解開發,那Springboot 中注解是如何實現bean 的注入呢?
@Configuration:指明當前類是配置類,就是代替上面說到的spring的配置文件.
@Bean 將方法返回值添加到容器當中,容器中這個組件默認的id 是方法名
@Configuration public class MyConfig { @Bean public PersonSerivcer personSerivcer(){ return new PersonSerivcer(); } }
這樣就可以就可以通過注解實現代替Spring 中的配置文件了。
三、SpringBoot 的Profile
我們這里就以yml文件為例
第一種是我在 主配置文件編寫的時候,文件名可以是application-{profile}.yml(application-dev.yml, application-prod.yml)
,默認使用 文件application.yml 的配置
1、如果我們想要使用的application-dev.yml 全局配置文件,在application.yml 指定即可。
配置實例:
在application.yml 配置文件中添加如下配置
spring: profiles: active: dev
在application-dev.ym 配置文件中添加如下配置l
server: port: 8080 #應用訪問的項目路徑 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中配置參數
--spring.profiles.active=dev
4、虛擬機的方式
在VM options下使用命令:-Dspring.profiles.active=prod
四、小結
實際開發中我們如果如果我們需要取 許多個配置項,就使用@ConfigurationProperties注解,如果只是注入一個屬性就使用@Value,
@PropertySource 注解加載指定的配置文件,@ImportResource 導入Spring 配置文件(這里可以使用注解來替代)。
看完這篇關于SpringBoot如何獲取配置文件的文章,如果覺得文章內容寫得不錯的話,可以把它分享出去給更多人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。