寫在前面
🛫更多知識總結見SpringBoot 2專欄
🚕本篇知識點總結自尚硅谷雷神的視頻
🚒博主對于該知識尚在學習階段
🚄如果發現存在問題請毫不吝嗇的指出
🚀🚀扎哇太棗糕的博客首頁🚀🚀
文章目錄
- 1 配置文件
- 1.1 yaml文件
- 1.1.1 基本語法
- 1.1.2 數據格式
- 1.2 數據綁定時關鍵字提示
- 2 web開發
- 2.1 靜態資源的存放與訪問
- 2.2 webjars
- 2.3 web小技巧
- 2.3.1 index頁面
- 2.3.2 網頁小圖標
- 2.4 web場景源碼淺析
1 配置文件
??之前說過,配置文件大致分兩種類型:properties、yaml。其中properties是最常規的配置文件類型:使用鍵值對等號的格式來對各種參數進行配置,后綴為.properties,在這里就不過多的進行贅述了。下面說一下yaml文件。
1.1 yaml文件
?? YAML全稱YAML Ain’t(isn’t) Markup Language,是一種直觀的能夠被電腦識別的數據序列化格式,YAML以數據為核心,比傳統的xml方式更加簡潔。體現在書寫的格式簡潔,表達的層級明顯,非常適合用來做以數據為中心的配置文件。yaml文件的后綴為.yml或者.yaml
1.1.1 基本語法
- 使用K: V進行鍵值映射,V前要有空格作為分隔符
- 區分大小寫
- 使用縮進表示層級關系
- 語法層面使用縮進不能用Tab鍵,要手敲空格。空格數不重要,只要是相同的空格數就代表相同的層級關系,所以相同層級的縮進空格要相同。但是實際操作的時候還是使用tab鍵,不會出現問題
- 注解使用#字符
1.1.2 數據格式
??yaml文件的數據格式可以使用如下的的格式約束,用注解注掉的就是這種類型的行內寫法,可以自行選擇習慣的形式進行使用。其中注意的是字符串類型的數據可以不用引號引起來,但是要是使用引號的話,單引號會將轉義字符作為字符串進行輸出,但是雙引號會將轉義字符轉義之后輸出,比如\n單引號就是\n雙引號就是換號符。
1.2 數據綁定時關鍵字提示
??在使用yaml配置文件進行配置的時候并不會進行代碼補全的相關提示,這樣不僅會大大降低代碼書寫效率,還會增加出錯的概率。于是,現在就有一種方法:在項目中加入配置處理器,即可實現編寫yaml文件的時候進行關鍵字提示。方法如下:
第一步: 導入相關依賴
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional> </dependency>
第二步: 重啟項目
??點擊運行或者重啟按鈕,重啟一下該SpringBoot項目
第三步: 測試
第四步: 在pom.xml文件中添加代碼
??即在打jar包的時候不將配置處理器打入jar包,否則會降低項目的效率
2 web開發
2.1 靜態資源的存放與訪問
??靜態資源可以理解為前端的固定頁面,這里面包含HTML、CSS、JS、圖片等等,不需要查數據庫也不需要程序處理,直接就能夠顯示的頁面。
存放路徑:
??所有的靜態資源在編程的時候都放在類路徑下的一個文件夾里,文件夾默認匹配以下四種命名的任意一種: static、public 、resources 、/META-INF/resources
資源訪問方式:
??將項目啟動開之后,使用當前項目根路徑/ + 靜態資源名 對靜態資源進行訪問。所有的靜態資源映射地址是/**
??當靜態資源和controller請求重名的時候,資源解析器會首先去找該名稱的Controller看能不能處理。不能處理的所有請求又都交給靜態資源處理器查找靜態資源,靜態資源也找不到則響應404頁面
自定義存放路徑、訪問方式:
??對配置文件的 spring. web.resources.static-locations配置項進行修改,可以改變默認的靜態資源存儲路徑。
對配置文件的 spring.mvc.static-path-pattern配置項進行修改,可以使得在訪問時擁有指定前綴的請求才會訪問靜態資源。如下圖,只有使用 /res前綴 + 靜態資源名訪問的時候才會訪問到相應的靜態資源
2.2 webjars
??webjars就是將前端所需要的技術jar(比如jquery)使用依賴進行導入,webjars的官方文檔就是展示jar對應的依賴,使用的時候直接復制到pom.xml文件即可。webjars的官方文檔:https://www.webjars.org/
2.3 web小技巧
2.3.1 index頁面
??不管是默認的還是自定義的靜態資源路徑,只要在下面創建一個index.html文件,這個頁面就將會被當做項目的歡迎頁面,也就是說訪問localhost: 端口號的時候就會訪問到index.html頁面。但是需要注意的是,不能自定義靜態資源的訪問方式,否則就會導致上述效果失效。
2.3.2 網頁小圖標
??不管是默認的還是自定義的靜態資源路徑,只要在下面添加一個命名為favicon.ico的圖片,即可將該圖片設置成網頁的小圖標。同時需要注意的是,不能自定義靜態資源的訪問方式,否則就會導致上述效果失效。
2.4 web場景源碼淺析
生效自動配置類:
??SpringBoot啟動的時候默認加載xxxAutoConfiguration類(自動配置類)是相關場景生效,SpringMVC功能的自動配置類是 WebMvcAutoConfiguration
配置綁定:
??@EnableConfigurationProperties注解將配置文件的相關屬性和xxx配置類進行了綁定,可以用于更改默認的配置信息。而通過分析源碼可知在WebMvcAutoConfiguration自動配置類里的WebMvcAutoConfigurationAdapter靜態類上有如下注解,注解參數中有兩個配置類,其中配置類與配置文件中的屬性綁定關系如下:WebMvcProperties.class --> spring.mvc WebProperties.class --> spring.web
@EnableConfigurationProperties({WebMvcProperties.class, WebProperties.class})
源碼中資源處理器的解析:
??在SpringBoot的源碼中有一個規則:有參構造器所有參數的值都會從容器中拿,于是在WebMvcAutoConfigurationAdapter靜態類里的有參構造器中,所有的參數都將直接從容器中獲取。
//ResourceProperties resourceProperties --> 獲取和spring.resources綁定的所有的值的對象
//WebMvcProperties mvcProperties --> 獲取和spring.mvc綁定的所有的值的對象
//ListableBeanFactory beanFactory --> Spring的beanFactory
//HttpMessageConverters --> 找到所有的HttpMessageConverters
//ResourceHandlerRegistrationCustomizer --> 找到資源處理器的自定義(重點解析)
//DispatcherServletPath --> 找到資源的路徑
//ServletRegistrationBean --> 給應用注冊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靜態類里的addResourceHandlers方法解析,得知資源解析器中資源處理的默認規則
public void addResourceHandlers(ResourceHandlerRegistry registry) {// 判斷resource.add-mappings的值true/false(默認為true,可以在配置文件修改配置項)if (!this.resourceProperties.isAddMappings()) {// resource.add-mappings的值為false,則禁用所有的靜態資源的訪問規則,debug日志輸出下面這句話logger.debug("Default resource handling disabled");return;}// resource.add-mappings的值true的話,定義規則// 定義緩存的相關配置Duration cachePeriod = this.resourceProperties.getCache().getPeriod();CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();// 定義webjars的資源存儲規則和緩存時間if (!registry.hasMappingForPattern("/webjars/**")) {customizeResourceHandlerRegistration(registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/").setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));}// 定義靜態資源的訪問規則// this.mvcProperties.getStaticPathPattern() --> 獲取靜態資源的訪問方式,默認是\/**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 的有參函數在下面圖片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;
}
??下圖解釋了為什么:自定義靜態資源的訪問方式會導致歡迎頁無法起到作用。SpringBoot的源碼中已經將這部分條件寫死了。