Spring Boot 從源碼淺讀到體現-web部分(一)

文章採用Spring Boot的源碼版本爲2.2.6
從源碼淺讀,到具體體現。

0x01.Spring Boot 對靜態資源的映射

  • Spring Boot中,SpringMVC的相關配置全部在類WebMvcutoConfiguration中。
    在這裏插入圖片描述
  • 我們可以從中瞭解Spring Boot對靜態資源的映射規則。

1.查看addResourceHandlers方法:

  • 該方法是增加資源映射的方法,在裏面映射了/webjars/,同時映射了靜態資源文件夾。
		@Override
		public void addResourceHandlers(ResourceHandlerRegistry registry) {
			if (!this.resourceProperties.isAddMappings()) {
				logger.debug("Default resource handling disabled");
				return;
			}
			Integer cachePeriod = this.resourceProperties.getCachePeriod();
			if (!registry.hasMappingForPattern("/webjars/**")) {
				customizeResourceHandlerRegistration(
						registry.addResourceHandler("/webjars/**")
								.addResourceLocations(
										"classpath:/META-INF/resources/webjars/")
						.setCachePeriod(cachePeriod));
			}
			String staticPathPattern = this.mvcProperties.getStaticPathPattern();
          	//靜態資源文件夾映射
			if (!registry.hasMappingForPattern(staticPathPattern)) {
				customizeResourceHandlerRegistration(
						registry.addResourceHandler(staticPathPattern)
								.addResourceLocations(
										this.resourceProperties.getStaticLocations())
						.setCachePeriod(cachePeriod));
			}
		}
  • 我們首先發現,在這個位置設置了緩存時間:
    在這裏插入圖片描述
  • 繼續跟蹤下去:
    在這裏插入圖片描述

在這裏插入圖片描述

  • 我們可以發現,靜態資源有關的參數,緩存時間等都在這個類中進行設置。

  • 我們還可以發現,所有對 /webjars/**的請求 ,都會去 classpath:/META-INF/resources/webjars/ 找資源。

在這裏插入圖片描述

  • webjars是以jar包的方式引入靜態資源。我們可以去webjars的官網查找對應的座標:
    http://www.webjars.org/

例如:引入bootstrap的jar包形式:

		<dependency>
            <groupId>org.webjars</groupId>
            <artifactId>bootstrap</artifactId>
            <version>4.0.0</version>
        </dependency>
  • 我們可以去相應的地方看到對應的靜態資源。

在這裏插入圖片描述

  • 繼續看下邊的代碼,在下面添加了一個靜態資源文件夾的映射:
    在這裏插入圖片描述

  • 跟蹤下去:
    在這裏插入圖片描述
    在這裏插入圖片描述

  • 也就是說,訪問當前的任何資源,都會默認去下面的路徑找,我們繼續跟蹤一下:
    在這裏插入圖片描述在這裏插入圖片描述
    在這裏插入圖片描述

  • 我們可以發現,它是一個字符串數組,也就是說,默認會去這幾個目錄尋找資源。

    • "classpath:/META-INF/resources/",
    • "classpath:/resources/",
    • "classpath:/static/",
    • "classpath:/public/"
      在這裏插入圖片描述

2.查看WelcomePageHandlerMapping方法:

  • 該方法是對歡迎頁面的映射。
@Bean
		public WelcomePageHandlerMapping welcomePageHandlerMapping(
				ResourceProperties resourceProperties) {
			return new WelcomePageHandlerMapping(resourceProperties.getWelcomePage(),
					this.mvcProperties.getStaticPathPattern());
		}
  • 我們先來看一下它獲取的歡迎頁是哪個頁面:
    在這裏插入圖片描述
    在這裏插入圖片描述
  • 我們發現,這些靜態文件夾的路徑都拼接上了index.html
  • 再來看一下被誰映射:
    在這裏插入圖片描述
    在這裏插入圖片描述
  • 也就是說,靜態資源文件夾下的所有index.html頁面;被"/**"映射。

3.總結

  • 從上述的源碼中,可以得到,Spring Boot的一些常用的靜態資源映射關係。

(1)所有 /webjars/** ,都去 classpath:/META-INF/resources/webjars/ 找資源;
(2)"/**" 訪問當前項目的任何資源,都去(靜態資源的文件夾)找映射;
(3)靜態資源文件夾下的所有index.html頁面;被"/**"映射;

0x02.Spring Boot 模板引擎–thymeleaf

  • 模板引擎(這裏特指用於Web開發的模板引擎)是爲了使用戶界面與業務數據(內容)分離而產生的,它可以生成特定格式的文檔,用於網站的模板引擎就會生成一個標準的HTML文檔。
  • SpringBoot推薦使用Thymeleaf,它的優點是語法簡單,功能強大。
  • Thymeleaf 是 Web 和獨立環境的現代服務器端 Java 模板引擎,能夠處理HTML,XML,JavaScript,CSS 甚至純文本。

1.導入thymeleaf:

  • pom.xml中導入thymeleaf的座標。
	<properties>
        <java.version>1.8</java.version>
        <thymeleaf.version>3.0.11.RELEASE</thymeleaf.version>
        <!-- 佈局功能的支持程序  thymeleaf3主程序  layout2以上版本 -->
        <!-- thymeleaf2   layout1-->
        <thymeleaf-layout-dialect.version>2.2.2</thymeleaf-layout-dialect.version>
    </properties>
    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

2.源碼查看默認配置:

在這裏插入圖片描述

  • 通過這段自動配置,我們可以發現,默認渲染的路徑是"classpath:/templates/",默認的後綴是.html
  • 也就是說只要我們把HTML頁面放在classpath:/templates/thymeleaf就能自動渲染。

3.簡單語法:

  • 先導入thymeleaf的名稱空間:
<html lang="en" xmlns:th="http://www.thymeleaf.org">
  • th:任意html屬性:來替換原生屬性的值。

例如:

<div th:text="${atfwus}" th:id=${id}>

0x03.Spring Boot 對Spring MVC的自動配置

1.查看Spring Boot官方的文檔:

在這裏插入圖片描述

2.翻譯及解釋:

  • Inclusion of ContentNegotiatingViewResolver and BeanNameViewResolver beans.

    • 自動配置了ViewResolver(視圖解析器:根據方法的返回值得到視圖對象,視圖對象決定如何渲染。轉發或者重定向)
    • ContentNegotiatingViewResolver:用於組合所有的視圖解析器;
    • 我們可以自己給容器中添加一個視圖解析器,ContentNegotiatingViewResolver會自動的將其組合進來;
  • Support for serving static resources, including support for WebJars (see below).

    • 靜態資源文件夾路徑以及webjars。
  • Automatic registration of Converter, GenericConverter, Formatter beans.

    • 自動註冊了 of Converter, GenericConverter, Formatter beans.
    • Converter:轉換器; 類型轉換使用Converter。
    • Formatter 格式化器;
    • 如果自己添加的格式化器轉換器,我們只需要放在容器中即可。
  • Support for HttpMessageConverters (see below).

    • HttpMessageConverter:SpringMVC用來轉換Http請求和響應的;
    • HttpMessageConverters 是從容器中確定;獲取所有的HttpMessageConverter
    • 如果自己給容器中添加HttpMessageConverter,只需要將自己的組件註冊容器中。
  • Automatic registration of MessageCodesResolver (see below).

    • 自動註冊了MessageCodesResolver。
    • 定義錯誤代碼生成規則
  • Static index.html support.

    • 靜態首頁訪問。
  • Custom Favicon support (see below). favicon.ico

    • 自定義圖標。
  • Automatic use of a ConfigurableWebBindingInitializer bean (see below).

    • 自動配置了ConfigurableWebBindingInitializer

3.修改SpringBoot的默認配置:

  • SpringBoot自動配置的原理:在自動配置很多組件的時候,先看容器中有沒有用戶自己配置的(@Bean、@Component)如果有就用用戶配置的,如果沒有,才自動配置;如果有些組件可以有多個(ViewResolver)將用戶配置的和自己默認的組合起來;
  • xxxConfigurer能夠幫助我們進行擴展配置。
  • xxxCustomizer能夠幫助我們進行定製配置。

4.具體擴展Spring MVC:

在這裏插入圖片描述

  • 如果您想保留Spring Boot MVC特性,並且只想添加額外的MVC配置(攔截器、格式化器、視圖控制器等),那麼可以添加自己的@configuration註解並繼承WebMvcConfigurerAdapter類,但不能使用@EnableWebMvc。如果希望提供RequestMappingHandlerMappingRequestMappingHandlerAdapterExceptionHandlerExceptionResolver的自定義實例,則可以聲明提供此類組件的WebMVCregistrationAdapter實例。
  • 也就是說,如果我們要對Spring MVC進行拓展,只需要加上@configuration註解並繼承WebMvcConfigurerAdapter類就可以了。

例如:

@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry){
        registry.addViewController("/save").setViewName("success");
    }
}
  • 原理探究:
  • 在自動配置類中導入了一個EnableWebMvcConfiguration配置類。

在這裏插入圖片描述

  • 這個類又繼承了一個DelegatingWebMvcConfiguration類,

在這裏插入圖片描述

  • 在這裏獲取了容器中的配置。

在這裏插入圖片描述

  • 我們找來一個實現的類查看一下:
    在這裏插入圖片描述

  • 我們可以發現,它實際上調用了所有的配置類。

-Spring Boot會將容器中所有的WebMvcConfigurer一起調用,SpringMVC的自動配置和我們的擴展配置都會起作用。

5.完全接管Spring MVC:

在這裏插入圖片描述

  • 如果您想完全接管Spring MVC,可以添加自己的@Configuration,並用@EnableWebMvc進行註釋。
  • 完全接管指的是,不需要SpringBoot對SpringMVC的自動配置,所有都是我們自己配置;所有的SpringMVC的自動配置全部失效。
  • 原理探究:一直追蹤這個註解
    在這裏插入圖片描述
  • 導入了一個配置類DelegatingWebMvcConfiguration

在這裏插入圖片描述

  • 這個類又繼承了WebMvcConfigurationSupport類。

在這裏插入圖片描述

  • 重點來了,在自動配置類WebMvcAutoConfiguration中,發現了下列這個註解。

在這裏插入圖片描述

  • 我們就能夠知道,如果使用了@EnableWebMvc,那麼所有的自動配置將會失效。

ATFWUS --Writing By 2020–04-28

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章