小編帶著小白看springboot源碼5

上一節(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ā)框架掌握熟練的可以加群乌询。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末榜贴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子妹田,更是在濱河造成了極大的恐慌唬党,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鬼佣,死亡現(xiàn)場離奇詭異驶拱,居然都是意外死亡,警方通過查閱死者的電腦和手機晶衷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門蓝纲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人晌纫,你說我怎么就攤上這事税迷。” “怎么了锹漱?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵箭养,是天一觀的道長。 經(jīng)常有香客問我哥牍,道長毕泌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任嗅辣,我火速辦了婚禮撼泛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘澡谭。我一直安慰自己愿题,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抠忘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪外永。 梳的紋絲不亂的頭發(fā)上崎脉,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音伯顶,去河邊找鬼囚灼。 笑死,一個胖子當(dāng)著我的面吹牛祭衩,可吹牛的內(nèi)容都是我干的灶体。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼掐暮,長吁一口氣:“原來是場噩夢啊……” “哼蝎抽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起路克,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤樟结,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后精算,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瓢宦,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年灰羽,在試婚紗的時候發(fā)現(xiàn)自己被綠了驮履。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡廉嚼,死狀恐怖玫镐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情怠噪,我是刑警寧澤摘悴,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站舰绘,受9級特大地震影響蹂喻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜捂寿,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一口四、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧秦陋,春花似錦蔓彩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽旷赖。三九已至,卻和暖如春更卒,著一層夾襖步出監(jiān)牢的瞬間等孵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工蹂空, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留俯萌,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓上枕,卻偏偏與公主長得像咐熙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子辨萍,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容