基於springboot的約定優於配置
的原則,在多數狀況下,啓動一個應用時,基本上無需作太多的配置,應用就能正常啓動。但在大部分開發環境下,添加額外配置是無所避免的,好比自定義應用端口號(比較在機器比較少的狀況下,一臺機器仍是須要部署多個應用的,固然利用docker
的話,是可避免的,這是後話了)、mq的服務地址、緩存服務的服務地址、數據庫的配置等,都或多或少的須要一些外部的配置項。html
springboot
默認的全局配置文件名爲application.properties或者application.yml(spring官方推薦使用的格式是.yml
格式,目前官網都是實例都是使用yml格式進行配置講解的),應用啓動時會自動加載此文件,無需手動引入。除此以外還有一個bootstrap
的全局文件,它的加載順序在application
配置文件以前,主要是用於在應用程序上下文的引導階段,在後期講解springCloudConfig
時,主要是利用此特性,進行配置文件的動態修改,在此不表,在一般狀況下,此兩個配置文件是沒有差異的,因此通常上都只須要配置application
便可。java
application.properties
配置文件支持自定義屬性的支持,好比git
blog.address=https://blog.lqdev.cn blog.author=oKong
而後可經過@Value("${blog.author}")
的形式獲取屬性值。github
@RestController public class DemoController { @Value("${blog.address}") String address; @Value("${blog.author}") String author; @Value("${blog.desc}") String desc; @RequestMapping("/") public String demo() { return desc; } }
這裏提醒下,在填寫一些默認的好比,數據庫屬性時,可以使用
alt+/
的方式,IDE會自動顯示提示,避免了手動嵌入屬性值或者忘記屬性的尷尬。spring
關於自定義屬性時,特別是一些公用包,會使用到屬性值時,建議在建立additional-spring-configuration-metadata.json
屬性元文件,這樣在使用上述快捷方式時,會進行提示,包括屬性名和屬性說明,這樣也方便調用者詢問屬性名是啥。docker
相關configuration-metadata
說明可查看:https://docs.spring.io/spring-boot/docs/current/reference/html/configuration-metadata.html數據庫
在配置文件中,各個屬性參數可進行引用的,好比:json
blog.address=https://blog.lqdev.cn blog.author=oKong blog.desc=${blog.author},${blog.address}
最後blog.desc
的值便可:oKong,https://blog.lqdev.cn
。利用此特性,並可實現一些特殊的功能。好比後期講解spring cloud
時,註冊eurka
註冊中心的實例名時,並會使用相似以下配置,使得實例名一眼就知道哪臺服務地址:bootstrap
eureka.instance.instance-id=${spring.cloud.client.ipAddress}:${server.port}
這裏須要注意,因爲springboot
在讀取properties
文件時,使用的是PropertiesPropertySourceLoader
類進行讀取,默認讀取的編碼是ISO 8859-1
,故在默認的配置文件中使用中文時,會出現亂碼,此時能夠將中文轉成Unicode
編碼或者使用yml
配置格式(默認就支持utf-8),再不濟能夠將做爲配置寫入到一個自定義配置文件,利用@PropertySource
註解的encoding
屬性指定編碼數組
Spring Boot的屬性配置文件中能夠經過${random}
來產生int值、long值或者string字符串,來支持屬性的隨機值。
# 隨機字符串 .blog.value=${random.value} # 隨機int .blog.number=${random.int} # 隨機long .blog.bignumber=${random.long} # 10之內的隨機數 .blog.test1=${random.int(10)} # 1-20的隨機數 .blog.test2=${random.int[1,20]}
在多數狀況下,配置信息基本上都是放入application.properties
文件中,但在一些場景下,好比某個配置項比較多時,爲了分開存放,也可自定義配置文件,如my.properties
。因爲自定義的文件,系統不會自動加載,這個時候就須要手動引入了。 利用@PropertySource
註解既能夠引入配置文件,須要引入多個時,可以使用@PropertySources
設置數組,引入多個文件。
@SpringBootApplication @PropertySource(value="classpath:my.properties",encoding="utf-8") public class Chapter3Application { public static void main(String[] args) { SpringApplication.run(Chapter3Application.class, args); } }
雖然使用@Value()
方式,能方便的引入自定義的屬性值,但在多某個配置項屬於某一配置時,但願對應到一個實體配置類中,springboot也提供了支持。利用@ConfigurationProperties
屬性,便可完成 my.properties配置文件:
config.code=code config.name=趔趄的猿 config.hobby[0]=看電影 config.hobby[1]=旅遊
實體類:
@Component //@EnableConfigurationProperties(value= {Config.class}) @ConfigurationProperties(prefix="config") @Data public class Config { String code; String name; List<String> hobby; }
這裏可直接加入@Component
使其在啓動時被自動掃描到,或者使用@EnableConfigurationProperties
註解註冊此實體bean. 其次,在引入@ConfigurationProperties
時,IDE會提示你引入spring-boot-configuration-processor
依賴,前面提到,在自定義屬性時,建立additional-spring-configuration-metadata.json
可進行屬性提示,而此依賴功能相似,會編譯時自動生成spring-configuration-metadata.json
文件,此文件主要給IDE使用,用於提示使用。添加後在配置文件點擊屬性時,會自動跳轉到對應綁定的實體類中
配置瞭如下配置,而後利用List<String>
就能獲取hobby的值了。
config.code=code config.name=趔趄的猿 config.hobby[0]=看電影 config.hobby[1]=旅遊
499452441
lqdevOps
完整實例地址:chapter-3
本文地址:https://blog.lqdev.cn/2018/07/14/springboot/chapter-third/