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)空格要相同。但是實際操作的時候還是使用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ù)綁定時關(guān)鍵字提示
??在使用yaml配置文件進(jìn)行配置的時候并不會進(jìn)行代碼補全的相關(guān)提示,這樣不僅會大大降低代碼書寫效率,還會增加出錯的概率。于是,現(xiàn)在就有一種方法:在項目中加入配置處理器,即可實現(xiàn)編寫yaml文件的時候進(jìn)行關(guān)鍵字提示。方法如下:
第一步: 導(dǎo)入相關(guān)依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
第二步: 重啟項目
點擊運行或者重啟按鈕,重啟一下該SpringBoot項目
第三步: 測試
第四步: 在pom.xml文件中添加代碼
即在打jar包的時候不將配置處理器打入jar包,否則會降低項目的效率
2 web開發(fā)
2.1 靜態(tài)資源的存放與訪問
??靜態(tài)資源可以理解為前端的固定頁面,這里面包含HTML、CSS、JS、圖片等等,不需要查數(shù)據(jù)庫也不需要程序處理,直接就能夠顯示的頁面。
存放路徑: 所有的靜態(tài)資源在編程的時候都放在類路徑下的一個文件夾里,文件夾默認(rèn)匹配以下四種命名的任意一種: static、public 、resources 、/META-INF/resources
資源訪問方式:
將項目啟動開之后,使用當(dāng)前項目根路徑/ + 靜態(tài)資源名 對靜態(tài)資源進(jìn)行訪問。所有的靜態(tài)資源映射地址是/**
當(dāng)靜態(tài)資源和controller請求重名的時候,資源解析器會首先去找該名稱的Controller看能不能處理。不能處理的所有請求又都交給靜態(tài)資源處理器查找靜態(tài)資源,靜態(tài)資源也找不到則響應(yīng)404頁面
自定義存放路徑、訪問方式:
對配置文件的 spring. web.resources.static-locations配置項進(jìn)行修改,可以改變默認(rèn)的靜態(tài)資源存儲路徑。
對配置文件的 spring.mvc.static-path-pattern配置項進(jìn)行修改,可以使得在訪問時擁有指定前綴的請求才會訪問靜態(tài)資源。如下圖,只有使用 /res前綴 + 靜態(tài)資源名訪問的時候才會訪問到相應(yīng)的靜態(tài)資源
2.2 webjars
??webjars就是將前端所需要的技術(shù)jar(比如jquery)使用依賴進(jìn)行導(dǎo)入,webjars的官方文檔就是展示jar對應(yīng)的依賴,使用的時候直接復(fù)制到pom.xml文件即可。webjars的官方文檔:https://www.webjars.org/
2.3 web小技巧
2.3.1 index頁面
??不管是默認(rèn)的還是自定義的靜態(tài)資源路徑,只要在下面創(chuàng)建一個index.html文件,這個頁面就將會被當(dāng)做項目的歡迎頁面,也就是說訪問localhost: 端口號的時候就會訪問到index.html頁面。但是需要注意的是,不能自定義靜態(tài)資源的訪問方式,否則就會導(dǎo)致上述效果失效。
2.3.2 網(wǎng)頁小圖標(biāo)
??不管是默認(rèn)的還是自定義的靜態(tài)資源路徑,只要在下面添加一個命名為favicon.ico的圖片,即可將該圖片設(shè)置成網(wǎng)頁的小圖標(biāo)。同時需要注意的是,不能自定義靜態(tài)資源的訪問方式,否則就會導(dǎo)致上述效果失效。
2.4 web場景源碼淺析
生效自動配置類: SpringBoot啟動的時候默認(rèn)加載xxxAutoConfiguration類(自動配置類)是相關(guān)場景生效,SpringMVC功能的自動配置類是 WebMvcAutoConfiguration
配置綁定:
@EnableConfigurationProperties注解將配置文件的相關(guān)屬性和xxx配置類進(jìn)行了綁定,可以用于更改默認(rèn)的配置信息。而通過分析源碼可知在WebMvcAutoConfiguration自動配置類里的WebMvcAutoConfigurationAdapter靜態(tài)類上有如下注解,注解參數(shù)中有兩個配置類,其中配置類與配置文件中的屬性綁定關(guān)系如下:WebMvcProperties.class --> spring.mvc WebProperties.class --> spring.web
@EnableConfigurationProperties({WebMvcProperties.class, WebProperties.class})
源碼中資源處理器的解析: 在SpringBoot的源碼中有一個規(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 --> 找到資源處理器的自定義(重點解析) //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,可以在配置文件修改配置項) 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ī)則和緩存時間 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使用sonarqube來檢查技術(shù)債務(wù)
今天小編就為大家分享一篇關(guān)于spring boot使用sonarqube來檢查技術(shù)債務(wù),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12Java中實現(xiàn)多線程關(guān)鍵詞整理(總結(jié))
這篇文章主要介紹了Java中實現(xiàn)多線程關(guān)鍵詞整理,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-05-05Spring實戰(zhàn)之使用c:命名空間簡化配置操作示例
這篇文章主要介紹了Spring實戰(zhàn)之使用c:命名空間簡化配置操作,結(jié)合實例形式詳細(xì)分析了Spring使用c:命名空間簡化配置的相關(guān)接口與配置操作技巧,需要的朋友可以參考下2019-12-12SpringBoot + WebSocket 實現(xiàn)答題對戰(zhàn)匹配機制案例詳解
這篇文章主要介紹了SpringBoot + WebSocket 實現(xiàn)答題對戰(zhàn)匹配機制,分別為每個用戶擬定四種在線狀態(tài),通過流程圖給大家展示,需要的朋友可以參考下2021-05-05