上一節(jié)走了一遍從瀏覽器發(fā)出請求到得到向頁面的流程,基本的功能是已經(jīng)實現(xiàn)了甸祭。但是現(xiàn)在啊,我想自定義一個攔截器(攔截器可以做用戶登錄驗證褥影,如果登錄了池户,就讓你通過,如果沒有登錄凡怎,就重定向登錄頁面)校焦,這里就不復(fù)雜了,簡單實現(xiàn)以下原理栅贴,除了不攔截“/hello”請求斟湃,其他請求我都攔截并跳轉(zhuǎn)到index.html熏迹。
1.了解springboot的配置類格式
springboot的配置類最常見的就是在類上面標(biāo)注@Configuration檐薯,表示這是一個配置類(就是以前的xml);
第一種:在配置類的里面就有很多的@Bean標(biāo)注的方法(就是以前的<bean id="" class=""></bean>),方法名是id注暗,方法返回值是class坛缕;
第一種擴充:標(biāo)注了@Bean的方法里面返回值匿名內(nèi)部類的形式
第二種:在配置類里面還寫個靜態(tài)內(nèi)部類,靜態(tài)內(nèi)部類里面也有@Bean以及一些重寫的方法捆昏。
第三種:配置類繼承某個類赚楚,重寫了父類方法
只要是想添加組件,你自定義的@Bean骗卜,可以放在任意的配置類中(標(biāo)了@Configuration注解宠页,或者寫在有main方法的主配置類中)
配置類用的比較多的就是這幾種左胞,還有一些其他的可以自己多查查資料,或者分析一下源碼举户。
首先這種直接加@Bean的方式就不說了烤宙,先說說第三種(這種常用啊)俭嘁,再說說第一種的擴充躺枕。第二種就不說了,我們現(xiàn)階段用不到供填,不過看springboot自動配置類里面大量用到這種方式拐云,所以這就導(dǎo)致了springboot就那幾十個自動配置類,就幾乎配置了web應(yīng)用所有組件近她。
2. 第三種的方式
在springboot中叉瘩,提供了一組接口,xxxConfigurer泄私,這種接口就是讓你擴展功能的房揭,比如你想添加一個自定義的視圖解析器,就可以實現(xiàn)這個接口晌端,重寫configureViewResolvers方法捅暴,原理后面會講到。
現(xiàn)在以WebMvcConfigurer接口為例咧纠,初步認(rèn)識這個東西蓬痒。WebMvcConfigurer顧名思義,就是webmvc配置器漆羔,可以讓你擴充webmvc里面的功能擦剑。
在這里不得不說一下璧帝,面向接口和面向抽象類編程的區(qū)別了。面向接口變成就是你要實現(xiàn)接口中【所有所有】的方法,管你用不用得上岳掐;但是,假如有個抽象類去實現(xiàn)了這個接口(抽象類里面都是空方法榜轿,還可以自己添加新的方法)亥贸,然后我們只需要去繼承這個抽象類,重寫其中我們需要的方法就可以了讯嫂,用多少蹦锋,就重寫多少。
基于這種思想欧芽,springboot提供了一個抽象類WebMvcConfigurerAdapter去實現(xiàn)WebMvcConfigurer接口莉掂,所以我們只需要繼承WebMvcConfigurerAdapter就可以了。
現(xiàn)在就來自定義一個攔截器千扔,攔截器的原理就不說了憎妙,就三個方法库正,preHandle(調(diào)用controller里面方法前首先調(diào)用此方法,登錄驗證主要在這里)厘唾,postHandle(后)诀诊,afterCompletion(返回頁面之后),springboot定義攔截器(可以實現(xiàn)HandlerInterceptor接口阅嘶,也可以繼承HandlerInterceptorAdapter抽象類属瓣,原因跟上面一樣),我這里就是繼承的方式讯柔。
上圖下面的是我自己寫的邏輯抡蛙,就是轉(zhuǎn)發(fā)到index.html頁面,emmmm....我也不知道這個index.html會不會被視圖解析器解析,反正寫“/index.html”可以魂迄,直接寫“index”也行粗截,自己嘗試一下吧!
寫個繼承抽象類WebMvcConfigurerAdapter的配置類
這種很方便吧捣炬,而且WebConfigurerAdapter內(nèi)部方法很多熊昌,可以重寫的方法很多,自己去嘗試啊 湿酸。
3.第一種擴充的方式
隨便找個標(biāo)有@Configuration或者相關(guān)的配置類婿屹,我就在主配置類配置了。
這樣配置也行推溃,這種比上面一種簡潔一點昂利,不用特意寫一個配置類了。
看到這里铁坎,肯定有很多小伙伴會驚呼蜂奸,我日了狗哦,為什么這樣就會配置到應(yīng)用中坝财肌扩所?你就實現(xiàn)了一個方法或者把一個xxxconfigurer的匿名類丟到容器(匿名內(nèi)部類----->繼承xxxConfiguratorAdapter-------->實現(xiàn)xxxConfigurer接口),springboot就會找到組件并用起來朴乖,這么厲害祖屏。
下面就來粗略看看原理(不用想,還是在自動配置類里面寒砖,記住赐劣,一切原理都在自動配置類里面)
4.一起看看xxxConfigurer原理(以WebMvcConfigurer為例)
首先打開自動配置類------->WebMvcAutoConfiguration嫉拐,找到
這個類EnableWebMvcConfiguration也是一個本自動配置類的一個靜態(tài)內(nèi)部類哩都,下面重寫的方法也就是調(diào)用父類的一些方法(這里偷個懶,就不帶著去看了)婉徘,所以重點就是父類DelegatingWebMvcConfiguration
打開父類可以看到漠嵌,而且這個此類下面所有重寫的方法咐汞,就是調(diào)用configurers這個容器的方法。
打開這個容器WebMvcConfigurerComposite儒鹿,你會發(fā)現(xiàn)這里就是遍歷所有的configurers化撕,挨個執(zhí)行每個方法。
所有的基本邏輯說完了约炎,看到這里肯定蒙比了植阴,前面的都忘記的差不多了,這是正郴常現(xiàn)象掠手。
那么,這里就再總結(jié)一下前面的原理狸捕,回顧一下:
首先是定義一個繼承WebMvcConfigurerAdapter抽象類(WebMvcConfigurer類型)的攔截器喷鸽,攔截器是一個WebMvcConfigurer類型的------------->實現(xiàn)了addInterceptor(registry)方法添加攔截映射-------------->這個【W(wǎng)ebMvcConfigurer】類型的攔截器丟到容器里,供別的組件從容器中獲染呐摹(springboot大量用這種原理做祝,實現(xiàn)什么功能的組件直接丟到容器中,就不用你操心了)鸡岗。
然后啟動springboot應(yīng)用混槐,自動配置類加載-------------->加載EnableWebMvcConfiguration.class內(nèi)部類-------->這個內(nèi)部類調(diào)用父類【DelegatingWebMvcConfiguration】方法--------->父類DelegatingWebMvcConfiguration功能就是從容器中獲取獲取所有的WebMvcConfigurer類型的組件,運用一定的方式遍歷所有的WebMvcConfigurer轩性,并依次運行所有的方法(包括自定義的addInterceptor方法纵隔,以及自定義的其他方法都是在這里運行)------------>等待你在瀏覽器url輸入,判斷是否滿足攔截條件進行攔截
這里就是簡單的說了一下WebMvcConfigurer的原理炮姨,適合萌新入門使用捌刮,想要更深入的可以自己去走走源碼,會理解的很清楚的舒岸。而且绅作,推薦一個學(xué)習(xí)springboot的學(xué)習(xí)方式,跟著我的或者別的大佬的教程蛾派,源碼走一遍俄认,只是看完了一兩遍效果不大,吃碗飯的功夫就忘記了(親測:檎А)眯杏,要想自己理解,還是需要自己多走走源碼壳澳,走個五六遍岂贩,七八遍,你會撥開云霧見天明.....
在這里給大家提供一個學(xué)習(xí)交流的平臺巷波,Java技術(shù)交流┟ 810309655
具有1-5工作經(jīng)驗的萎津,面對目前流行的技術(shù)不知從何下手卸伞,需要突破技術(shù)瓶頸的可以加群。
在公司待久了锉屈,過得很安逸荤傲,但跳槽時面試碰壁。需要在短時間內(nèi)進修颈渊、跳槽拿高薪的可以加群遂黍。
如果沒有工作經(jīng)驗,但基礎(chǔ)非常扎實俊嗽,對java工作機制妓湘,常用設(shè)計思想,常用java開發(fā)框架掌握熟練的可以加群乌询。