<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
SpringBoot中免除了大部分手動設定,但是對於一些特定的情況,還是需要我們進行手動設定的,SpringBoot為我們提供了application.properties組態檔,讓我們可以進行自定義設定,來對預設的設定進行修改,以適應具體的生產情況,當然還包括一些第三方的設定。
幾乎所有設定都可以寫到application.peroperties檔案中,這個檔案會被SpringBoot自動載入,免去了我們手動載入的煩惱。
但實際上,很多時候我們卻會自定義組態檔,這些檔案就需要我們進行手動載入,SpringBoot是不會自動識別這些檔案的,下面就來仔細看看這些方面的內容。
SpringBoot可以識別兩種格式的組態檔,分別是yml檔案與properties檔案,我們可以將application.properties檔案換成application.yml,這兩個檔案都可以被SpringBoot自動識別並載入,但是如果是自定義的組態檔,就最好還是使用properties格式的檔案,因為SpringBoot中暫時還並未提供手動載入yml格式檔案的功能(這裡指註解方式)。
application.properties組態檔欲被SpringBoot自動載入,需要放置到指定的位置:src/main/resource目錄下,一般自定義的組態檔也位於此目錄之下。
載入的意思就是將檔案讀取到Spring容器之中,更確切的說就是將各個設定項裝載到Spring上下文容器之中供隨時取用。
application.properties組態檔是在SpringBoot專案啟動的時候被自動載入的,其內部的相關設定會自動覆蓋SpringBoot預設的對應設定項,所以的設定項均會儲存到Spring容器之中。
donghao.name=唯一浩哥 donghao.sex=男 donghao.age=80
自定義的xxx.properties組態檔是不會被SpringBoot自動載入的,需要手動去進行載入,這裡的手動載入一般指的是註解的方式載入,這裡就涉及到我們今天的重點之一:載入自定義屬性檔案的註解:@PropertySource("classpath:xxx.properties"),這個註解專門用來載入指定位置的properties檔案,Spring暫未提供載入指定位置yml檔案的註解,所以才有之前的說法。
donghao1.name=動畫 donghao1.sex=女 donghao1.age=22
其實無論對於哪裡的properties檔案,當我們需要使用其中設定內容的時候,就在當前類的頂部加註該註解,將該組態檔載入到記憶體,這些組態檔一次載入即可多次使用。
但更通用的情況是新建一個設定類,使用@Configuration標註,再加上之前的@PropertySource("classpath:xxx.properties")註解,而類的內部並不需要任何內容,這是一個純粹的設定載入類。
由於@Configuration的作用(底層為@Component),他會被Spring的掃描器掃到,並載入到JVM,並建立Bean,而建立的時候就會執行組態檔中設定項的載入。
這種方式載入的設定可以在任何Spring管轄的類中用@Value("${key}")的方式使用,見下方介紹。
設定項的使用其實很簡單,只要是載入到Spring容器中的設定項都可以直接使用@Value("${key}")的方式來參照,一般將其設定在欄位頂部,表示將設定項的值賦值給該欄位。
當然更多的情況是將這些設定項與一個JavaBean繫結起來使用,這樣繫結一次,我們就可以隨時使用。這裡涉及到兩種情況,一種是將application.properties中的設定與JavaBean繫結,一種是將自定義組態檔中的設定與Javabean繫結。
第一種:applicaiton.properties屬性繫結JavaBean
這種情況相對簡單(因為application.properties檔案會被自動載入,也就是說設定項會被自動載入到記憶體,到Spring容器之中,省去了手動載入的設定),然後我們在要與屬性繫結的JavaBean的類定義頂部加@Component註解和@ConfigurationProperties(prefix="key")註解,
前者的目的是為了這個JavaBean可以被SpringBoot專案啟動時候被掃描到並載入到Spring容器之中,重點是後者,這個註解一般不是單獨使用的,他一般與後面要說的@EnableConfigurationProperties(JavaBean.class)配合使用,但是二者並非使用在同一位置,@ConfigurationProperties(prefix="key")註解加註在JavaBean類定義之上,按字面可以理解為屬性設定註解,更直接點的說法就是屬性繫結註解,
官方解釋是:如果想要繫結或者驗證一些來源自.properties檔案中的額外屬性時,你可以在一個標註的@Configuration的類的注有@Bean註解的方法或者一個類之上加註這個註解。
我們完全可以將其理解為繫結專用註解。它的作用就是將指定的字首的設定項的值與JavaBean的欄位繫結,這裡要注意,為了繫結的成功,一般將欄位的名稱與設定項鍵的最後一個鍵名相同,這樣整個鍵在去掉字首的情況下就和欄位名稱一致,以此來進行繫結。
第二種:自定義設定的屬性繫結JavaBean
這種情況與之前的基本相同,只是不能自動載入,需要手動載入,在JavaBean之上加上之前介紹的@PropertySource註解進行組態檔載入。還有一點就是將@Component改為@Configuration,為什麼這麼做呢?
@Configuration註解的底層就是@Component,但是二者意義不同,@Configuration註解側重設定之意,@Component側重元件之意,當然設定也是專案元件之一,在這裡我們要將組態檔屬性與JavaBean繫結,當然更側重設定之意。
將設定與JavaBean繫結之後,我們就可以通過JavaBean來獲取設定的內容,而且JavaBean已經被@Component註解或者@Configuration註解載入到Spring容器,我們可以使用自動注入的方式在其他類中隨便使用。
這裡要注意一點:當我們在某個類中要使用這個JavaBean時,需要在這個類中指定這個JavaBean的型別,這個指定也要使用註解來指定,正是之前介紹的@EnableConfigurationProperties註解,這個註解與@ConfigurationProperties註解配套使用。
官方給出的解釋:這個註解是對@ConfigurationProperties的有效支援。
標註有@ConfigurationProperties註解的Beans可以被使用標準的方式註冊(使用@Bean註解),或者,為了方便起見,直接用使用@EnableConfigurationProperties指定註冊。意思是這個註解提供了一種方便直接的註冊Bean的方式。
package com.donghao.model; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; @Configuration @PropertySource("classpath:donghao.properties") @ConfigurationProperties(prefix="donghao1") public class Donghao { private String name; private String sex; private String age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } }
package com.donghao.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.donghao.model.Donghao; @RestController @RequestMapping("/donghao") @EnableConfigurationProperties(Donghao.class) public class DonghaoController { @Autowired Donghao donghao; @Value("${donghao.name}") private String name; @Value("${donghao.sex}") private String sex; @Value("${donghao.age}") private String age; @RequestMapping("/hello") public String hello(){ return "我的名字叫"+name+",我是"+sex+"生,今年"+age+"歲了!"; } @RequestMapping("/ss") public String ss(){ return donghao.getName()+donghao.getSex()+donghao.getAge(); } }
package com.donghao; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DonghaoApplication { public static void main(String[] args) { SpringApplication.run(DonghaoApplication.class, args); } }
啟動程式之後,瀏覽器存取:http://localhost:8080/donghao/hello,結果為:
瀏覽器存取:http://localhost:8080/donghao/ss
我這裡要重點強調一點,載入和使用並不相關聯,雖然載入的目的是為了使用,但是載入和使用之間並不是強關聯的,我們完全可以載入但不使用,所以我們應該將載入的過程與使用的過程分開來分析,它們對應於不同的註解,這些註解之間也不是強關聯的,他們各有各的用途,如果只是載入自定義組態檔,只要一個@PropertySource註解就完事,使用方面的註解不用去管,當需要使用的時候,我們完全可以選擇多種使用的方式,直接使用的話我們就使用@Value註解進行直接賦值,這個註解就可以直接將被載入到Spring容器中(environment)的屬性設定的值賦值到指定的欄位,當然也可以使用繫結JavaBean的方式。
還有一點要注意,千萬不要在公共組態檔application.properties和自定義組態檔xxx.properties中設定相同的的設定項的不同值,因為公共組態檔的優先權最高,會覆蓋掉自定義組態檔中的內容,你可以這麼理解,公共組態檔中的某個設定被在啟動時載入到Spring容器中,之後又在另外一個自定義組態檔中載入了同名的設定項,二者有不同的值,但是系統會檢查二者的優先權,誰高誰留,誰低誰走,最後自定義組態檔中的值無效。
補充:感謝朋友Vtria丶提出的問題,這裡新增一點補充內容
有些時候我們需要定義一些靜態的欄位(變數),也想使用這種方式實現值的注入,但是發現注入不進去,原因何在呢?這需要對值注入的原理有些瞭解,值的注入和屬性的注入類似,都是基於set方法實現的,那麼就簡單了,我們只要針對靜態變數新增set方法即可,但是新增之後發現還是不好使,因為我們還需要將Value註解轉移到set方法上來,這樣就可以實現注入了。set方法的寫法可以與普通變數的寫法相同,用this呼叫,也可以直接類名點用。
比如:我們在applicaiton.properties中新增:
huahua=123321
然後在DonghaoController中新增如下程式碼:
private static String huahua; @Value("${huahua}") public void setHuahua(String huahua){ // this.huahua = huahua; DonghaoController.huahua = huahua; } @RequestMapping("/hh") public String hh(){ return "新的測試"+ huahua; }
上面的兩種寫法均可實現目標。
如此施為,即可實現靜態變數的值注入。
瀏覽器存取:http://localhost:8080/donghao/hh
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45