- Spring Boot進(jìn)階:原理、實(shí)戰(zhàn)與面試題分析
- 鄭天民
- 1404字
- 2022-07-05 09:41:38
1.2.3 Spring Boot配置體系
通過(guò)前面的分析,我們可以看到在開(kāi)發(fā)Web應(yīng)用程序時(shí),使用Spring Boot比Spring WebMVC更為簡(jiǎn)單高效。你可能已經(jīng)注意到了,以往在使用Spring WebMVC時(shí)需要指定的數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)、Web服務(wù)端點(diǎn)等一系列配置信息都不見(jiàn)了。我們只需要在Maven中添加一項(xiàng)spring-boot-starter-web依賴(lài)并實(shí)現(xiàn)一個(gè)Controller,就可以提供微服務(wù)架構(gòu)中所推崇的RESTful風(fēng)格的接口。這需要引入Spring Boot中最具創(chuàng)新性的一項(xiàng)功能,即自動(dòng)配置機(jī)制。事實(shí)上,如果沒(méi)有特殊的配置需求,開(kāi)發(fā)人員完全可以基于Spring Boot內(nèi)置的配置體系完成諸如數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)等功能的相關(guān)配置信息的自動(dòng)集成。
在Spring Boot中,對(duì)配置信息的管理采用約定優(yōu)于配置的設(shè)計(jì)理念。在這一理念下,開(kāi)發(fā)人員所需要設(shè)置的配置信息數(shù)量比起使用傳統(tǒng)Spring框架將大大減少。那么,Spring Boot是如何組織和管理這些配置信息的呢?
為了達(dá)到集中化管理的目的,Spring Boot對(duì)配置文件的命名也做了一定的約定,分別使用label和profile來(lái)指定配置信息的版本以及運(yùn)行環(huán)境。其中l(wèi)abel表示配置版本控制信息,而profile則用來(lái)指定該配置文件所對(duì)應(yīng)的環(huán)境。在Spring Boot中,配置文件同時(shí)支持.properties和.yml兩種文件格式,結(jié)合label和profile的概念,如下所示的配置文件命名都是常見(jiàn)和合法的:
/{application}.yml
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
Yaml這種標(biāo)記語(yǔ)言的語(yǔ)法和其他高級(jí)語(yǔ)言類(lèi)似,并且可以非常直觀(guān)地表達(dá)各種列表、清單、標(biāo)量等數(shù)據(jù)形態(tài),特別適合用來(lái)表達(dá)或編輯數(shù)據(jù)結(jié)構(gòu)和各種配置文件。例如,我們可以指定如代碼清單1-5所示的數(shù)據(jù)源配置,這里使用了.yml文件。
代碼清單1-5 基于.yml文件的數(shù)據(jù)源配置示例
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/user username: root password: root
如果采用.properties配置文件,那么上述配置信息將表現(xiàn)為如代碼清單1-6所示的形式。
代碼清單1-6 基于.properties文件的數(shù)據(jù)源配置示例
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://127.0.0.1:3306/user spring.datasource.username=root spring.datasource.password=root
顯然,類(lèi)似這樣的數(shù)據(jù)源通常會(huì)根據(jù)環(huán)境的不同而存在很多套配置。通常,推薦的做法是為每個(gè)不同的環(huán)境提供一個(gè)獨(dú)立的配置文件。例如我們可以分別針對(duì)prod、test、uat等環(huán)境提供對(duì)應(yīng)的配置文件,如下所示:
application-prod.properties
application-uat.properties
application-test.properties
application.properties
注意這里有一個(gè)沒(méi)有添加任何環(huán)境后綴的application.properties配置文件。在Spring Boot中,這個(gè)application.properties就是主配置文件,是所有配置信息管理的入口。Spring Boot在獲取配置信息時(shí),會(huì)先從這個(gè)主配置文件中讀取相應(yīng)的配置。因此,我們可以把那些適用于所有環(huán)境的全局配置信息放在application.properties中。
另外,在Spring Boot中,我們可以在主配置文件中使用如代碼清單1-7所示的配置方式來(lái)激活當(dāng)前所使用的Profile。
代碼清單1-7 激活當(dāng)前所使用的Profile配置示例
spring.profiles.active = prod
上述配置項(xiàng)意味著系統(tǒng)在讀取完application.properties中的全局配置信息之后會(huì)繼續(xù)讀取application-prod.yml配置文件中的配置內(nèi)容。
如果我們不希望在全局配置文件中指定所需要激活的Profile,而是想把這個(gè)過(guò)程延遲到運(yùn)行這個(gè)服務(wù)時(shí),那么可以直接在java -jar命令中添加--spring.profiles.active參數(shù),如代碼清單1-8所示。
代碼清單1-8 通過(guò)java -jar命令激活Profile代碼示例
java -jar userservice-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
這種實(shí)現(xiàn)方案在通過(guò)腳本進(jìn)行自動(dòng)化打包和部署的場(chǎng)景下非常有用。
接下來(lái),我們給出一些常見(jiàn)開(kāi)發(fā)場(chǎng)景的配置示例。對(duì)于一個(gè)Web應(yīng)用程序而言,最常見(jiàn)的配置可能就是指定服務(wù)暴露的端口地址,如代碼清單1-9所示。
代碼清單1-9 服務(wù)暴露的端口地址配置示例
server: port: 8080
同時(shí),數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)也是Web應(yīng)用程序的基本功能。因此,關(guān)于數(shù)據(jù)源的設(shè)置也是一種常見(jiàn)的配置場(chǎng)景,我們已經(jīng)在前面給出了一個(gè)基本的示例。這里再以JPA為例,給出如代碼清單1-10所示的一種配置方案。
代碼清單1-10 數(shù)據(jù)源配置示例
spring: jpa: hibernate: ddl-auto: create show-sql: true
顯然,這里使用了Hibernate作為JPA規(guī)范的實(shí)現(xiàn)框架,并設(shè)置了show-sql等相關(guān)屬性。
最后,開(kāi)發(fā)人員一般需要對(duì)日志級(jí)別和對(duì)象進(jìn)行設(shè)置,代碼清單1-11所示的就是一個(gè)典型的配置示例。
代碼清單1-11 日志配置示例
logging.level.root=WARN logging.level.com.springboot.user=INFO
我們?cè)O(shè)置了系統(tǒng)的全局日志級(jí)別為WARN,而針對(duì)自定義的com.springboot.user包下的日志,則將其級(jí)別調(diào)整到INFO。
- OpenShift開(kāi)發(fā)指南(原書(shū)第2版)
- AngularJS Web Application Development Blueprints
- Web Development with Django Cookbook
- Magento 2 Development Cookbook
- Koa開(kāi)發(fā):入門(mén)、進(jìn)階與實(shí)戰(zhàn)
- Mastering OpenCV 4
- HTML5+CSS3網(wǎng)站設(shè)計(jì)教程
- Effective Python Penetration Testing
- Kali Linux Wireless Penetration Testing Beginner's Guide(Third Edition)
- 微服務(wù)從小白到專(zhuān)家:Spring Cloud和Kubernetes實(shí)戰(zhàn)
- Buildbox 2.x Game Development
- Troubleshooting Citrix XenApp?
- Arduino可穿戴設(shè)備開(kāi)發(fā)
- GitHub入門(mén)與實(shí)踐
- Web前端開(kāi)發(fā)最佳實(shí)踐