摘要:不同的環(huán)境之間的配置存在覆蓋關(guān)系。提供了一種統(tǒng)一的方式來管理應(yīng)用的配置,允許開發(fā)人員使用屬性文件文件環(huán)境變量和命令行參數(shù)來定義優(yōu)先級不同的配置值。比如命令行參數(shù)的優(yōu)先級被設(shè)置為最高。
一.關(guān)于Spring Boot的配置
Spring Boot 對于開發(fā)人員最大的好處在于可以對 Spring 應(yīng)用進(jìn)行自動配置。Spring Boot 會根據(jù)應(yīng)用中聲明的第三方依賴來自動配置 Spring 框架,而不需要進(jìn)行顯式的聲明。比如當(dāng)聲明了對 HSQLDB 的依賴時,Spring Boot 會自動配置成使用 HSQLDB 進(jìn)行數(shù)據(jù)庫操作。
Spring Boot 的自動配置功能是沒有侵入性的,只是作為一種基本的默認(rèn)實現(xiàn)。開發(fā)人員可以通過定義其他配置 bean 來替代自動配置所提供的功能(使用@Configuration注解)。比如當(dāng)應(yīng)用中定義了自己的數(shù)據(jù)源 bean 時,自動配置所提供的 HSQLDB 就不會生效。這給予了開發(fā)人員很大的靈活性,既可以快速的創(chuàng)建一個可以立即運行的原型應(yīng)用,又可以不斷的修改和調(diào)整以適應(yīng)應(yīng)用開發(fā)在不同階段的需要。Spring Boot 使得這樣的切換變得很簡單。
注意,自動配置永遠(yuǎn)是第二位的,一旦你配置自己的東西,那自動配置的就會被覆蓋。
Spring Boot如何處理多配置在應(yīng)用中管理配置并不是一個容易的任務(wù),尤其是在應(yīng)用需要部署到多個環(huán)境中時。通常會需要為每個環(huán)境提供一個對應(yīng)的屬性文件,用來配置各自的數(shù)據(jù)庫連接信息、服務(wù)器信息和第三方服務(wù)賬號等。通常的應(yīng)用部署會包含開發(fā)、測試和生產(chǎn)等若干個環(huán)境。不同的環(huán)境之間的配置存在覆蓋關(guān)系。Spring Boot 提供了一種統(tǒng)一的方式來管理應(yīng)用的配置,允許開發(fā)人員使用屬性文件、YAML 文件、環(huán)境變量和命令行參數(shù)來定義優(yōu)先級不同的配置值。
Spring Boot 所提供的配置優(yōu)先級順序比較復(fù)雜。按照優(yōu)先級從高到低的順序,具體的列表如下所示。
命令行參數(shù)。
通過 System.getProperties() 獲取的 Java 系統(tǒng)參數(shù)。
操作系統(tǒng)環(huán)境變量。
從 java:comp/env 得到的 JNDI 屬性。
通過 RandomValuePropertySource 生成的1random.*1屬性。
應(yīng)用 Jar 文件之外的屬性文件。
應(yīng)用 Jar 文件內(nèi)部的屬性文件。
在應(yīng)用配置 Java 類(包含@Configuration注解的 Java 類)中通過@PropertySource注解聲明的屬性文件。
通過SpringApplication.setDefaultProperties聲明的默認(rèn)屬性。
Spring Boot 的這個配置優(yōu)先級看似復(fù)雜,其實是很合理的。比如命令行參數(shù)的優(yōu)先級被設(shè)置為最高。這樣的好處是可以在測試或生產(chǎn)環(huán)境中快速地修改配置參數(shù)值,而不需要重新打包和部署應(yīng)用。
SpringApplication 類默認(rèn)會把以“--”開頭的命令行參數(shù)轉(zhuǎn)化成應(yīng)用中可以使用的配置參數(shù),如 “--name=Alex” 會設(shè)置配置參數(shù) “name” 的值為 “Alex”。比如在啟動一個Spring Boot項目的時候使用java -jar ${項目名}.jar --server.port=9090命令,則該項目的端口就被設(shè)置成了9090.
二.屬性(properties)文件配置屬性文件是最常見的管理配置屬性的方式。Spring Boot 提供的 SpringApplication 類會搜索并加載 application.properties 文件來獲取配置屬性值。SpringApplication 類會在下面位置搜索該文件。
* 當(dāng)前目錄的“/config”子目錄。 * 當(dāng)前目錄。 * classpath 中的“/config”包。 * classpath
上面的順序也表示了該位置上包含的屬性文件的優(yōu)先級。優(yōu)先級按照從高到低的順序排列。
對于配置屬性,可以在代碼中通過“@Value”注解來使用,這點和普通的Spring項目一樣。如下例:
創(chuàng)建一個SpringBoot的Maven項目,項目結(jié)構(gòu)如下:
pom.xml文件中引入Spring Boot Parent和Spring Boot Web的依賴:
org.springframework.boot spring-boot-starter-parent 1.5.7.RELEASE org.springframework.boot spring-boot-starter-web com.google.code.gson gson 2.8.0
在resources目錄下創(chuàng)建一個名為application.properties 的文件,將如下內(nèi)容添加至該文件:
book.name=HongLouMeng book.author=曹雪芹 book.publisher=u4e09u8054u51fau7248u793e book.price=68.5
創(chuàng)建啟動類:
package com.ddcx.springboot.democonfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class ConfigDemoApplication { public static void main(String[] args) { //讀取默認(rèn)配置文件的啟動方式 SpringApplication.run(ConfigDemoApplication.class, args); } }
再創(chuàng)建一個controller類,在這個類中就可以通過@Value從配置文件中獲取配置好的值:
package com.ddcx.springboot.democonfig.controller; import com.ddcx.springboot.democonfig.entity.Book; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class DemoController { @Value("${book.name}") private String bookName; @Value("${book.author}") private String bookAuthor; @Value("${book.publisher}") private String publisher; @Value("${book.price}") private String price; @RequestMapping("/bookInfo") String bookInfo() { return "bookName-->" + bookName + " bookAuthor-->" + bookAuthor + " publisher-->" + publisher + " price-->" + price ; } }
在postman中發(fā)送請求得到如下結(jié)果:
properties文件中的中文出現(xiàn)了亂碼問題,可以在properties文件中改用unicode編碼的方式。
除此之外,還可以配置服務(wù)器端口、數(shù)據(jù)庫等各種配置:
# 配置服務(wù)器端口為8090 server.port=8090 # 配置應(yīng)用的根路徑,必須以"/"開頭,否則會報異常: # java.lang.IllegalArgumentException: ContextPath must start with "/ and not end with "/" server.context-path=/demo-config
除了使用@Value注解綁定配置屬性值之外,還可以使用@ConfigurationProperties(prefix="book")注解,配置屬性中以“book”為前綴的屬性值會被自動綁定到 Java 類中同名的屬性上,前提是要有屬性的set方法。這種方法可以方便地配置數(shù)據(jù)庫。
在這個示例中比如創(chuàng)建一個Book類:
package com.ddcx.springboot.democonfig.entity; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Component //因為要使用自動注入,所以要掃描注冊到ioc容器中 @ConfigurationProperties(prefix="book") public class Book { private String name; private String author; private String publisher; private double price; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getPublisher() { return publisher; } public void setPublisher(String publisher) { this.publisher = publisher; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } }
在前面縮寫的DemoController中自動注入一個Book屬性,添加如下代碼:
private static Gson gson = new Gson(); @Autowired private Book book; @RequestMapping("/prefixConfigTest") String prefixConfigTest() { return gson.toJson(book); }
在postman中測試表明也可以獲取到application.properties中的配置,并且服務(wù)器的端口配置也可以同時得到驗證:
SpringBoot 如何更改默認(rèn)配置文件的名稱前面講到,默認(rèn)情況下SpringBoot 會去指定的路徑下搜索文件名稱為 application.yml、application.properties的配置文件,那如何自己定義配置文件名?
在SpringBoot中可以通過“spring.config.name”配置屬性來指定不同的屬性文件名稱。也可以通過“spring.config.location”來添加額外的屬性文件的搜索路徑。如果應(yīng)用中包含多個 profile,可以為每個 profile 定義各自的屬性文件,按照“application-{profile}”來命名。
接下來可以實際操作一下,首先在resources目錄下再創(chuàng)建一個 springboot-config.properties 的文件,
并在配置文件中添加內(nèi)容:
book.name=Effective Java book.author=Joshua Bloch server.port=8070
在將啟動類的啟動方式改成如下:
package com.ddcx.springboot.democonfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; @SpringBootApplication public class ConfigDemoApplication { public static void main(String[] args) { //讀取默認(rèn)配置文件的啟動方式 //SpringApplication.run(ConfigDemoApplication.class, args); //讀取自定義配置文件名的啟動方式 new SpringApplicationBuilder(ConfigDemoApplication.class) .properties("spring.config.location=classpath:/springboot-config.properties") .run(args); } }
訪問結(jié)果:
這里會有一個現(xiàn)象,如果 application.properties 和 springboot-config.properties 兩個文件同時存在,當(dāng)application.properties中的配置在pringboot-config.properties也同樣配置了,比如上面的bookName,那么pringboot-config.properties中的配置優(yōu)先級更高,當(dāng)application.properties中的配置在pringboot-config.properties沒有配置,那么application.properties中的那項配置仍然會起作用,比如上面的publisher和server.context-path等。但是如果將 application.properties文件名改成其它的,比如 application-config.properties,則完全以pringboot-config.properties這個配置文件為準(zhǔn)。
除了屬性文件,SpringApplication 類也提供了對 YAML 配置文件的支持,下面給出了 application.yml 文件的示例。
注意:使用.yml時,屬性名的值和冒號中間必須有空格,如branch: master正確,branch:master就是錯的。
user: username: 張三 age: 22 contactAddress[0]: province: hunan city: changsha area: yuhuaqu contactAddress[1]: province: guangdong city: guangzhou area: tianhequ
SpringBoot的配置支持嵌套和幾何配置,對于上面的配置,對應(yīng)如下User和Address兩個類:
package demoyaml.entity; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.List; /** * Created by liaosi on 2017/10/7. */ @Component @ConfigurationProperties(prefix = "user") public class User { private String username; private Integer age; private List contactAddress; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public List getContactAddress() { return contactAddress; } public void setContactAddress(List contactAddress) { this.contactAddress = contactAddress; } }
package demoyaml.entity; /** * Created by liaosi on 2017/10/7. */ public class Address { private String province; private String city; private String area; public String getProvince() { return province; } public void setProvince(String province) { this.province = province; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getArea() { return area; } public void setArea(String area) { this.area = area; } }
在Controller中添加訪問這個配置的user對象的方法:
package demoyaml.controller; import com.google.gson.Gson; import demoyaml.entity.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class DemoController { private static Gson gson = new Gson(); @Autowired private User user; @RequestMapping("/getUser") String getUser() { return gson.toJson(user); } }
訪問結(jié)果:
四.多環(huán)境配置在實際開發(fā)中,通常會有開發(fā)、測試、生產(chǎn)等多種環(huán)境,SpringBoot是怎么來配置多種環(huán)境的呢?
1.properties多環(huán)境配置(1)在項目中添加不同環(huán)境的配置文件
(2)在application.properties配置文件中配置需要激活那個環(huán)境:
#激活哪一個環(huán)境的配置文件 spring.profiles.active=dev #公共配置 spring.jackson.date-format=yyyy-MM-dd HH:mm:ss:2.yaml多環(huán)境配置
在application中增加內(nèi)容:
#激活哪一個環(huán)境的配置文件 spring: profiles: active: development --- spring: profiles: development db: url: jdbc:hsqldb:file:testdb username: dev password: dev #在配置文件增加三個短橫線區(qū)分不同的環(huán)境 --- spring: profiles: test db: url: jdbc:mysql://localhost/test username: test password: test
定義一個DBConfig類,獲取激活的那個環(huán)境的配置:
package demoyaml.entity; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Component @ConfigurationProperties(prefix = "db") public class DBConfig { private String url; private String username; private String password; public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
通過controller中的方法查看:
package demoyaml.controller; import com.google.gson.Gson; import demoyaml.entity.DBConfig; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class DemoController { private static Gson gson = new Gson(); @Autowired private DBConfig DBConfig; @RequestMapping("/getEnvConfig") String getDBConfig() { return gson.toJson(DBConfig); } }3.兩種配置方式的比較
* Properties配置多環(huán)境,需要添加多個配置文件,YAML只需要一個配件文件 * 書寫格式的差異,yaml相對比較簡潔,優(yōu)雅 * YAML的缺點:不能通過@PropertySource注解加載。如果需要使用@PropertySource注解的方式加載值,那就要使用properties文件。
本節(jié)示例代碼已上傳到github: https://github.com/liaosilzu2...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/71016.html
摘要:引入了新的環(huán)境和概要信息,是一種更揭秘與實戰(zhàn)六消息隊列篇掘金本文,講解如何集成,實現(xiàn)消息隊列。博客地址揭秘與實戰(zhàn)二數(shù)據(jù)緩存篇掘金本文,講解如何集成,實現(xiàn)緩存。 Spring Boot 揭秘與實戰(zhàn)(九) 應(yīng)用監(jiān)控篇 - HTTP 健康監(jiān)控 - 掘金Health 信息是從 ApplicationContext 中所有的 HealthIndicator 的 Bean 中收集的, Spring...
摘要:響應(yīng)式編程是基于異步和事件驅(qū)動的非阻塞程序,只是垂直通過在內(nèi)啟動少量線程擴(kuò)展,而不是水平通過集群擴(kuò)展。三特性常用的生產(chǎn)的特性如下響應(yīng)式編程模型適用性內(nèi)嵌容器組件還有對日志消息測試及擴(kuò)展等支持。 摘要: 原創(chuàng)出處 https://www.bysocket.com 「公眾號:泥瓦匠BYSocket 」歡迎關(guān)注和轉(zhuǎn)載,保留摘要,謝謝! 02:WebFlux 快速入門實踐 文章工程: JDK...
摘要:開公眾號差不多兩年了,有不少原創(chuàng)教程,當(dāng)原創(chuàng)越來越多時,大家搜索起來就很不方便,因此做了一個索引幫助大家快速找到需要的文章系列處理登錄請求前后端分離一使用完美處理權(quán)限問題前后端分離二使用完美處理權(quán)限問題前后端分離三中密碼加鹽與中異常統(tǒng)一處理 開公眾號差不多兩年了,有不少原創(chuàng)教程,當(dāng)原創(chuàng)越來越多時,大家搜索起來就很不方便,因此做了一個索引幫助大家快速找到需要的文章! Spring Boo...
摘要:本文參考官方文檔部分特定版本如版本官方文檔地址注本文基于構(gòu)建話說在上已經(jīng)有多顆星了,足見火爆程度簡介以下介紹引自創(chuàng)建獨立的應(yīng)用程序直接嵌入,或無需部署文件提供自己的入門來簡化你的配置盡可能自動配置提供生產(chǎn)就緒功能,如指標(biāo),運行 本文參考 Spring Boot官方文檔 Part II. Getting Started部分特定版本如1.5.10.RELEASE版本官方文檔地址:https...
閱讀 2009·2021-09-30 09:53
閱讀 1852·2021-09-24 09:48
閱讀 1762·2019-08-30 14:01
閱讀 2174·2019-08-29 18:35
閱讀 1255·2019-08-26 18:27
閱讀 2985·2019-08-26 12:12
閱讀 950·2019-08-23 17:16
閱讀 943·2019-08-23 15:31