SpringBoot2零基礎(chǔ)到精通之配置文件與web開發(fā)
1 配置文件
??之前說過,配置文件大致分兩種類型:properties、yaml。其中properties是最常規(guī)的配置文件類型:使用鍵值對等號的格式來對各種參數(shù)進(jìn)行配置,后綴為.properties,在這里就不過多的進(jìn)行贅述了。下面說一下yaml文件。
1.1 yaml文件
?? YAML全稱YAML Ain't(isn't) Markup Language,是一種直觀的能夠被電腦識別的數(shù)據(jù)序列化格式,YAML以數(shù)據(jù)為核心,比傳統(tǒng)的xml方式更加簡潔。體現(xiàn)在書寫的格式簡潔,表達(dá)的層級明顯,非常適合用來做以數(shù)據(jù)為中心的配置文件。yaml文件的后綴為.yml或者.yaml
1.1.1 基本語法
- 使用K: V進(jìn)行鍵值映射,V前要有空格作為分隔符
- 區(qū)分大小寫
- 使用縮進(jìn)表示層級關(guān)系
- 語法層面使用縮進(jìn)不能用Tab鍵,要手敲空格??崭駭?shù)不重要,只要是相同的空格數(shù)就代表相同的層級關(guān)系,所以相同層級的縮進(jìn)空格要相同。但是實(shí)際操作的時(shí)候還是使用tab鍵,不會出現(xiàn)問題
- 注解使用#字符
1.1.2 數(shù)據(jù)格式
??yaml文件的數(shù)據(jù)格式可以使用如下的的格式約束,用注解注掉的就是這種類型的行內(nèi)寫法,可以自行選擇習(xí)慣的形式進(jìn)行使用。其中注意的是字符串類型的數(shù)據(jù)可以不用引號引起來,但是要是使用引號的話,單引號會將轉(zhuǎn)義字符作為字符串進(jìn)行輸出,但是雙引號會將轉(zhuǎn)義字符轉(zhuǎn)義之后輸出,比如\n單引號就是\n雙引號就是換號符。

1.2 數(shù)據(jù)綁定時(shí)關(guān)鍵字提示
??在使用yaml配置文件進(jìn)行配置的時(shí)候并不會進(jìn)行代碼補(bǔ)全的相關(guān)提示,這樣不僅會大大降低代碼書寫效率,還會增加出錯(cuò)的概率。于是,現(xiàn)在就有一種方法:在項(xiàng)目中加入配置處理器,即可實(shí)現(xiàn)編寫yaml文件的時(shí)候進(jìn)行關(guān)鍵字提示。方法如下:
第一步: 導(dǎo)入相關(guān)依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
第二步: 重啟項(xiàng)目
點(diǎn)擊運(yùn)行或者重啟按鈕,重啟一下該SpringBoot項(xiàng)目
第三步: 測試

第四步: 在pom.xml文件中添加代碼
即在打jar包的時(shí)候不將配置處理器打入jar包,否則會降低項(xiàng)目的效率

2 web開發(fā)
2.1 靜態(tài)資源的存放與訪問
??靜態(tài)資源可以理解為前端的固定頁面,這里面包含HTML、CSS、JS、圖片等等,不需要查數(shù)據(jù)庫也不需要程序處理,直接就能夠顯示的頁面。
存放路徑: 所有的靜態(tài)資源在編程的時(shí)候都放在類路徑下的一個(gè)文件夾里,文件夾默認(rèn)匹配以下四種命名的任意一種: static、public 、resources 、/META-INF/resources
資源訪問方式:
將項(xiàng)目啟動開之后,使用當(dāng)前項(xiàng)目根路徑/ + 靜態(tài)資源名 對靜態(tài)資源進(jìn)行訪問。所有的靜態(tài)資源映射地址是/**
當(dāng)靜態(tài)資源和controller請求重名的時(shí)候,資源解析器會首先去找該名稱的Controller看能不能處理。不能處理的所有請求又都交給靜態(tài)資源處理器查找靜態(tài)資源,靜態(tài)資源也找不到則響應(yīng)404頁面
自定義存放路徑、訪問方式:
對配置文件的 spring. web.resources.static-locations配置項(xiàng)進(jìn)行修改,可以改變默認(rèn)的靜態(tài)資源存儲路徑。

對配置文件的 spring.mvc.static-path-pattern配置項(xiàng)進(jìn)行修改,可以使得在訪問時(shí)擁有指定前綴的請求才會訪問靜態(tài)資源。如下圖,只有使用 /res前綴 + 靜態(tài)資源名訪問的時(shí)候才會訪問到相應(yīng)的靜態(tài)資源

2.2 webjars
??webjars就是將前端所需要的技術(shù)jar(比如jquery)使用依賴進(jìn)行導(dǎo)入,webjars的官方文檔就是展示jar對應(yīng)的依賴,使用的時(shí)候直接復(fù)制到pom.xml文件即可。webjars的官方文檔:https://www.webjars.org/
2.3 web小技巧
2.3.1 index頁面
??不管是默認(rèn)的還是自定義的靜態(tài)資源路徑,只要在下面創(chuàng)建一個(gè)index.html文件,這個(gè)頁面就將會被當(dāng)做項(xiàng)目的歡迎頁面,也就是說訪問localhost: 端口號的時(shí)候就會訪問到index.html頁面。但是需要注意的是,不能自定義靜態(tài)資源的訪問方式,否則就會導(dǎo)致上述效果失效。
2.3.2 網(wǎng)頁小圖標(biāo)
??不管是默認(rèn)的還是自定義的靜態(tài)資源路徑,只要在下面添加一個(gè)命名為favicon.ico的圖片,即可將該圖片設(shè)置成網(wǎng)頁的小圖標(biāo)。同時(shí)需要注意的是,不能自定義靜態(tài)資源的訪問方式,否則就會導(dǎo)致上述效果失效。

2.4 web場景源碼淺析
生效自動配置類: SpringBoot啟動的時(shí)候默認(rèn)加載xxxAutoConfiguration類(自動配置類)是相關(guān)場景生效,SpringMVC功能的自動配置類是 WebMvcAutoConfiguration
配置綁定:
@EnableConfigurationProperties注解將配置文件的相關(guān)屬性和xxx配置類進(jìn)行了綁定,可以用于更改默認(rèn)的配置信息。而通過分析源碼可知在WebMvcAutoConfiguration自動配置類里的WebMvcAutoConfigurationAdapter靜態(tài)類上有如下注解,注解參數(shù)中有兩個(gè)配置類,其中配置類與配置文件中的屬性綁定關(guān)系如下:WebMvcProperties.class --> spring.mvc WebProperties.class --> spring.web
@EnableConfigurationProperties({WebMvcProperties.class, WebProperties.class})
源碼中資源處理器的解析: 在SpringBoot的源碼中有一個(gè)規(guī)則:有參構(gòu)造器所有參數(shù)的值都會從容器中拿,于是在WebMvcAutoConfigurationAdapter靜態(tài)類里的有參構(gòu)造器中,所有的參數(shù)都將直接從容器中獲取。
//ResourceProperties resourceProperties --> 獲取和spring.resources綁定的所有的值的對象
//WebMvcProperties mvcProperties --> 獲取和spring.mvc綁定的所有的值的對象
//ListableBeanFactory beanFactory --> Spring的beanFactory
//HttpMessageConverters --> 找到所有的HttpMessageConverters
//ResourceHandlerRegistrationCustomizer --> 找到資源處理器的自定義(重點(diǎn)解析)
//DispatcherServletPath --> 找到資源的路徑
//ServletRegistrationBean --> 給應(yīng)用注冊Servlet、Filter....
public WebMvcAutoConfigurationAdapter(ResourceProperties resourceProperties, WebMvcProperties mvcProperties,
ListableBeanFactory beanFactory, ObjectProvider<HttpMessageConverters> messageConvertersProvider,
ObjectProvider<ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizerProvider,
ObjectProvider<DispatcherServletPath> dispatcherServletPath,
ObjectProvider<ServletRegistrationBean<?>> servletRegistrations) {
this.resourceProperties = resourceProperties;
this.mvcProperties = mvcProperties;
this.beanFactory = beanFactory;
this.messageConvertersProvider = messageConvertersProvider;
this.resourceHandlerRegistrationCustomizer = resourceHandlerRegistrationCustomizerProvider.getIfAvailable();
this.dispatcherServletPath = dispatcherServletPath;
this.servletRegistrations = servletRegistrations;
}
??通過對WebMvcAutoConfigurationAdapter靜態(tài)類里的addResourceHandlers方法解析,得知資源解析器中資源處理的默認(rèn)規(guī)則
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 判斷resource.add-mappings的值true/false(默認(rèn)為true,可以在配置文件修改配置項(xiàng))
if (!this.resourceProperties.isAddMappings()) {
// resource.add-mappings的值為false,則禁用所有的靜態(tài)資源的訪問規(guī)則,debug日志輸出下面這句話
logger.debug("Default resource handling disabled");
return;
}
// resource.add-mappings的值true的話,定義規(guī)則
// 定義緩存的相關(guān)配置
Duration cachePeriod = this.resourceProperties.getCache().getPeriod();
CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();
// 定義webjars的資源存儲規(guī)則和緩存時(shí)間
if (!registry.hasMappingForPattern("/webjars/**")) {
customizeResourceHandlerRegistration(registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/")
.setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
}
// 定義靜態(tài)資源的訪問規(guī)則
// this.mvcProperties.getStaticPathPattern() --> 獲取靜態(tài)資源的訪問方式,默認(rèn)是\/**
String staticPathPattern = this.mvcProperties.getStaticPathPattern();
if (!registry.hasMappingForPattern(staticPathPattern)) {
customizeResourceHandlerRegistration(registry.addResourceHandler(staticPathPattern)
// getStaticLocations()方法中
.addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations()))
.setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
}
}
源碼中歡迎頁的解析:
@Bean
public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext, FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) {
// 下面 welcomePageHandlerMapping 的有參函數(shù)在下面圖片
WelcomePageHandlerMapping welcomePageHandlerMapping = new WelcomePageHandlerMapping(new TemplateAvailabilityProviders(applicationContext), applicationContext, this.getWelcomePage(), this.mvcProperties.getStaticPathPattern());
welcomePageHandlerMapping.setInterceptors(this.getInterceptors(mvcConversionService, mvcResourceUrlProvider));
welcomePageHandlerMapping.setCorsConfigurations(this.getCorsConfigurations());
return welcomePageHandlerMapping;
}
??下圖解釋了為什么:自定義靜態(tài)資源的訪問方式會導(dǎo)致歡迎頁無法起到作用。SpringBoot的源碼中已經(jīng)將這部分條件寫死了。

到此這篇關(guān)于SpringBoot2零基礎(chǔ)到精通之配置文件與web開發(fā)的文章就介紹到這了,更多相關(guān)SpringBoot2 配置文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot Starters簡介及其優(yōu)劣勢
在這篇文章中,我們將向你介紹Spring Boot Starters,并將討論Spring Boot Starters的優(yōu)點(diǎn)和優(yōu)勢,感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧2018-05-05
Java實(shí)現(xiàn)的爬蟲抓取圖片并保存操作示例
這篇文章主要介紹了Java實(shí)現(xiàn)的爬蟲抓取圖片并保存操作,涉及Java針對頁面URL訪問、獲取、字符串匹配、文件下載等相關(guān)操作技巧,需要的朋友可以參考下2018-08-08
mybatis映射文件操作存儲過程的實(shí)現(xiàn)
本文主要介紹了mybatis映射文件操作存儲過程的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
關(guān)于@Transactional事務(wù)表被鎖的問題及解決
這篇文章主要介紹了關(guān)于@Transactional事務(wù)表被鎖的問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
Spring Data JPA 簡單查詢--方法定義規(guī)則(詳解)
下面小編就為大家?guī)硪黄猄pring Data JPA 簡單查詢--方法定義規(guī)則(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04
Spring Boot Admin(監(jiān)控工具)的使用
今天我們將會講解一個(gè)優(yōu)秀的監(jiān)控工具Spring Boot Admin。 它采用圖形化的界面,讓我們的Spring Boot管理更加簡單,需要的朋友可以參考下2020-02-02

