小編帶着小白看springboot源碼5

 上一節走了一遍從瀏覽器發出請求到得到向頁面的流程,基本的功能是已經實現了。但是現在啊,我想自定義一個攔截器(攔截器可以做用戶登錄驗證,如果登錄了,就讓你通過,如果沒有登錄,就重定向登錄頁面),這裏就不復雜了,簡單實現以下原理,除了不攔截“/hello”請求,其他請求我都攔截並跳轉到index.html。

1.瞭解springboot的配置類格式

  springboot的配置類最常見的就是在類上面標註@Configuration,表示這是一個配置類(就是以前的xml);

  第一種:在配置類的裏面就有很多的@Bean標註的方法(就是以前的<bean id="" class=""></bean>),方法名是id,方法返回值是class;

  第一種擴充:標註了@Bean的方法裏面返回值匿名內部類的形式

  第二種:在配置類裏面還寫個靜態內部類,靜態內部類裏面也有@Bean以及一些重寫的方法。

  第三種:配置類繼承某個類,重寫了父類方法

  只要是想添加組件,你自定義的@Bean,可以放在任意的配置類中(標了@Configuration註解,或者寫在有main方法的主配置類中)

  配置類用的比較多的就是這幾種,還有一些其他的可以自己多查查資料,或者分析一下源碼。

  首先這種直接加@Bean的方式就不說了,先說說第三種(這種常用啊),再說說第一種的擴充。第二種就不說了,我們現階段用不到,不過看springboot自動配置類裏面大量用到這種方式,所以這就導致了springboot就那幾十個自動配置類,就幾乎配置了web應用所有組件。

  1. 第三種的方式

  在springboot中,提供了一組接口,xxxConfigurer,這種接口就是讓你擴展功能的,比如你想添加一個自定義的視圖解析器,就可以實現這個接口,重寫configureViewResolvers方法,原理後面會講到。

  現在以WebMvcConfigurer接口爲例,初步認識這個東西。WebMvcConfigurer顧名思義,就是webmvc配置器,可以讓你擴充webmvc裏面的功能。

  在這裏不得不說一下,面向接口和麪向抽象類編程的區別了。面向接口變成就是你要實現接口中【所有所有】的方法,管你用不用得上;但是,假如有個抽象類去實現了這個接口(抽象類裏面都是空方法,還可以自己添加新的方法),然後我們只需要去繼承這個抽象類,重寫其中我們需要的方法就可以了,用多少,就重寫多少。

  基於這種思想,springboot提供了一個抽象類WebMvcConfigurerAdapter去實現WebMvcConfigurer接口,所以我們只需要繼承WebMvcConfigurerAdapter就可以了。

  現在就來自定義一個攔截器,攔截器的原理就不說了,就三個方法,preHandle(調用controller裏面方法前首先調用此方法,登錄驗證主要在這裏),postHandle(後),afterCompletion(返回頁面之後),springboot定義攔截器(可以實現HandlerInterceptor接口,也可以繼承HandlerInterceptorAdapter抽象類,原因跟上面一樣),我這裏就是繼承的方式。
小編帶着小白看springboot源碼5
上圖下面的是我自己寫的邏輯,就是轉發到index.html頁面,emmmm....我也不知道這個index.html會不會被視圖解析器解析,反正寫“/index.html”可以,直接寫“index”也行,自己嘗試一下吧!

  寫個繼承抽象類WebMvcConfigurerAdapter的配置類
小編帶着小白看springboot源碼5
這種很方便吧,而且WebConfigurerAdapter內部方法很多,可以重寫的方法很多,自己去嘗試啊 。

3.第一種擴充的方式

  隨便找個標有@Configuration或者相關的配置類,我就在主配置類配置了。
小編帶着小白看springboot源碼5
這樣配置也行,這種比上面一種簡潔一點,不用特意寫一個配置類了。

  看到這裏,肯定有很多小夥伴會驚呼,我日了狗哦,爲什麼這樣就會配置到應用中啊?你就實現了一個方法或者把一個xxxconfigurer的匿名類丟到容器(匿名內部類----->繼承xxxConfiguratorAdapter-------->實現xxxConfigurer接口),springboot就會找到組件並用起來,這麼厲害。

  下面就來粗略看看原理(不用想,還是在自動配置類裏面,記住,一切原理都在自動配置類裏面)

4.一起看看xxxConfigurer原理(以WebMvcConfigurer爲例)

  首先打開自動配置類------->WebMvcAutoConfiguration,找到
小編帶着小白看springboot源碼5
這個類EnableWebMvcConfiguration也是一個本自動配置類的一個靜態內部類,下面重寫的方法也就是調用父類的一些方法(這裏偷個懶,就不帶着去看了),所以重點就是父類DelegatingWebMvcConfiguration
小編帶着小白看springboot源碼5
打開父類可以看到,而且這個此類下面所有重寫的方法,就是調用configurers這個容器的方法。
小編帶着小白看springboot源碼5
小編帶着小白看springboot源碼5
打開這個容器WebMvcConfigurerComposite,你會發現這裏就是遍歷所有的configurers,挨個執行每個方法。
小編帶着小白看springboot源碼5
小編帶着小白看springboot源碼5
所有的基本邏輯說完了,看到這裏肯定蒙比了,前面的都忘記的差不多了,這是正常現象。

  那麼,這裏就再總結一下前面的原理,回顧一下:

  首先是定義一個繼承WebMvcConfigurerAdapter抽象類(WebMvcConfigurer類型)的攔截器,攔截器是一個WebMvcConfigurer類型的------------->實現了addInterceptor(registry)方法添加攔截映射-------------->這個【WebMvcConfigurer】類型的攔截器丟到容器裏,供別的組件從容器中獲取(springboot大量用這種原理,實現什麼功能的組件直接丟到容器中,就不用你操心了)。

  然後啓動springboot應用,自動配置類加載-------------->加載EnableWebMvcConfiguration.class內部類-------->這個內部類調用父類【DelegatingWebMvcConfiguration】方法--------->父類DelegatingWebMvcConfiguration功能就是從容器中獲取獲取所有的WebMvcConfigurer類型的組件,運用一定的方式遍歷所有的WebMvcConfigurer,並依次運行所有的方法(包括自定義的addInterceptor方法,以及自定義的其他方法都是在這裏運行)------------>等待你在瀏覽器url輸入,判斷是否滿足攔截條件進行攔截

  這裏就是簡單的說了一下WebMvcConfigurer的原理,適合萌新入門使用,想要更深入的可以自己去走走源碼,會理解的很清楚的。而且,推薦一個學習springboot的學習方式,跟着我的或者別的大佬的教程,源碼走一遍,只是看完了一兩遍效果不大,吃碗飯的功夫就忘記了(親測!),要想自己理解,還是需要自己多走走源碼,走個五六遍,七八遍,你會撥開雲霧見天明.....

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