10個(gè)Spring&SpringBoot 高階用法包竹,相信你看完會有新的認(rèn)識

最新學(xué)習(xí)筆記==> 手寫RPC框架(6)-使用Netty改寫后遇到的各種坑你是否清楚

目錄

【目錄】Spring&SpringBoot 實(shí)踐和源碼學(xué)習(xí)

1淤袜、獲取Spring IOC容器(Aware)

image.png

通過ApplicationContextAware實(shí)現(xiàn),在bean實(shí)例化后衰伯,經(jīng)過Aware掃描時(shí)铡羡,發(fā)現(xiàn)實(shí)現(xiàn)了ApplicationContextAware接口,就會調(diào)用setApplicationContext方法注入applicationcontext對象意鲸,這也是非常經(jīng)典的一種獲取上下文的方法烦周。

2、動態(tài)注冊bean信息(BeanFactoryPostProcessor)

image

通過實(shí)現(xiàn)BeanDefinitionRegistryPostProcessor接口完成bean的動態(tài)注入怎顾,而且圖中的動態(tài)生成還相比一般的注冊更加復(fù)雜读慎,往其中添加了類似于@Value一般的屬性值,盡管我們后續(xù)無任何操作槐雾,Spring在進(jìn)行數(shù)據(jù)填充的時(shí)候還是成功的從Properties文件中獲取到了有效數(shù)據(jù)贪壳,這主要依靠的是PropertyPlaceHolderConfigure。

也有更簡單的方法實(shí)現(xiàn)bean的動態(tài)注冊蚜退,例如

((DefaultListableBeanFactory) beanFactory).registerBeanDefinition("school1", beanDefinition)

其實(shí)動態(tài)注冊bean非常簡單闰靴,只需要獲取到當(dāng)前的IOC容器,然后調(diào)用registerBeanDefinition即可钻注,至于獲取當(dāng)前IOC容器就可以使用Aware蚂且、BeanFactoryPostProcessor等方案

3幅恋、動態(tài)修改bean信息(BeanFactoryPostProcessor)

上面的例子2就很好的說明了修改bean的信息杏死,在postProcessBeanDefinitionRegistry方法中實(shí)現(xiàn)了注冊操作,在postProcessBeanFactory實(shí)現(xiàn)了修改bean信息的操作捆交,再例如下面這個(gè)例子

image

此外可以通過類似于BeanNameAware的獲取到bean的名稱信息等

image

4淑翼、獲取Spring IOC容器所有bean信息(BeanFactoryPostProcessor)

image

利用BeanFactoryPostProcessor的postProcessBeanFactory方法,獲得當(dāng)前的IOC容器品追,然后遍歷即可玄括。

提問:BeanFactoryPostProcessor 和 BeanPostProcessor的區(qū)別在哪里,一般各自有什么用途肉瓦?

關(guān)于上面2遭京,3胃惜,4三點(diǎn)更多的原理細(xì)節(jié)可以看看

5、為兼容不同SpringBoot 版本哪雕,以實(shí)現(xiàn)選擇性加載bean(條件注解)

image

使用了條件注解功能船殉,獲取當(dāng)前運(yùn)行的SpringBoot版本進(jìn)行判斷,類似于系統(tǒng)自帶的條件注解斯嚎,如下圖

image

主要實(shí)現(xiàn)原理得看OnClassCondition類利虫,是不是感覺和@Import類似呢?

拓展:是否清楚Spring 版本升級導(dǎo)致的WebMvcConfigurerAdapter不兼容問題堡僻,那么這個(gè)基于當(dāng)前版本的條件注解功能就能很好的兼容WebMvcConfigurerAdapter問題了列吼。

條件注解原理可看 Spring 之 Condition 條件注解 實(shí)踐和源碼學(xué)習(xí)

6、自定義工廠bean實(shí)例化(工廠Bean苦始、AbstractFactoryBean)

image

繼承了AbstractFactoryBean抽象類寞钥,createInstance是由afterPropertiesSet方法或者getObject方法調(diào)用,想獲取具體的Student對象陌选,則需要&區(qū)分工廠bean還是包裝bean理郑,具體看下面的圖就應(yīng)該很清楚了。

image

此外關(guān)于afterPropertiesSet方法是InitializingBean類唯一一個(gè)方法咨油,一般用來實(shí)例化bean之后的自定義修正或者處理初始化后的其他事情您炉。如需對Spring有更深入的理解,下面這個(gè)Spring Bean生命周期的流程圖就必須清楚役电。

image.png

來源自網(wǎng)絡(luò)

拓展閱讀

7赚爵、Spring MVC 輸出所有的URL信息(Spring MVC)

image

關(guān)鍵思想是獲取DispatcherServlet類中的handlerMappings數(shù)據(jù),而其數(shù)據(jù)由主要是從SpringIOC容器中的HandlerMapping類bean法瑟,然后分別處理冀膝,如圖中圈出來的只有RequestMappingHandlerMapping和BeanNameUrlHandlerMapping,這是不完整的霎挟,在Spring 3.2以前是DefaultAnnotationHandlerMapping類窝剖,但是已經(jīng)被廢棄了,這里就沒有補(bǔ)充酥夭,大家在使用的時(shí)候需要知道自己Spring的版本赐纱。

image

如上圖運(yùn)行結(jié)果,可以看到出來熬北,除了業(yè)務(wù)的url信息疙描,還包含了actuator端點(diǎn)信息以及swagger的url信息。

Spring MVC拓展閱讀

8讶隐、通過Spring事件機(jī)制完成服務(wù)啟動后的信息整理(類似于Dubbo的服務(wù)暴露機(jī)制起胰、Swagger的URL信息收集)

image

也很簡單,就是使用了Spring 監(jiān)聽機(jī)制去監(jiān)聽ContextRefreshedEvent這類Spring IOC容器刷新完成之后的事件觸發(fā)整份,本demo并沒有做什么事情待错,但是結(jié)合具體業(yè)務(wù)可以做很多想做的事情,可以看看Dubbo的服務(wù)暴露接口繼承關(guān)系烈评,如下圖火俄。

image

本圖來自本人簡書文章截圖:http://www.reibang.com/p/507d51bf14ce

如下圖是dubbo的源碼,充分利用了監(jiān)聽機(jī)制讲冠,監(jiān)聽ContextRefreshedEvent事件瓜客,最后調(diào)用export方法完成服務(wù)暴露操作。

image.png

如果去了解Swagger的工作原理會發(fā)現(xiàn)也是類似

拓展:RPC服務(wù)結(jié)合Spring中竿开,服務(wù)暴露大體上都是依靠事件監(jiān)聽機(jī)制完成的

9谱仪、通過Spring事件機(jī)制獲取HTTP請求調(diào)用詳情

image.png

在本地測試統(tǒng)計(jì)http服務(wù)調(diào)用統(tǒng)計(jì)情況,還是很方便的否彩,依靠的是ServletRequestHandledEvent事件疯攒,默認(rèn)這個(gè)事件是開啟的,如果未開啟該事件列荔,就會導(dǎo)致事件監(jiān)聽無效敬尺。

事件機(jī)制的原理可以看看 Spring Event事件通知機(jī)制 源碼學(xué)習(xí)

10、服務(wù)啟動后的初始化任務(wù)CommandLineRunner

這個(gè)就不再介紹了贴浙,相信大家也按照上述的原理分析和學(xué)習(xí)這個(gè)工具的使用砂吞。整體的思路也是類似的。

閱讀關(guān)于SpringBoot的啟動過程了解更多 SpringBoot 啟動過程源碼分析

總結(jié)

上面幾個(gè)功能點(diǎn)說來說去就是Aware崎溃、BeanPostProcessor蜻直、BeanFactoryPostProcessor、Event袁串,而且大家如果仔細(xì)分析springboot的源碼會發(fā)現(xiàn)概而,其實(shí)整體的Spring框架并沒有太多的改進(jìn),而是依賴上述的幾種鉤子延伸和拓展囱修,單獨(dú)一個(gè)BeanPostProcessor就延伸出了多少種子類到腥,再加上Order排序,就可以非常方便的拓展功能蔚袍。

問題:如何實(shí)現(xiàn)動態(tài)路由注冊(沒有明確的Controller層定義)

最后分享一張網(wǎng)上看到的Spring的執(zhí)行流程圖解乡范,寫的確實(shí)很詳細(xì),如果希望對Spring源碼有更多深入的了解啤咽,可以好好思考和學(xué)習(xí)~

image.png

原創(chuàng)推薦

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宇整,一起剝皮案震驚了整個(gè)濱河市瓶佳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鳞青,老刑警劉巖霸饲,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件为朋,死亡現(xiàn)場離奇詭異,居然都是意外死亡厚脉,警方通過查閱死者的電腦和手機(jī)习寸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來傻工,“玉大人霞溪,你說我怎么就攤上這事≈欣Γ” “怎么了鸯匹?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長泄伪。 經(jīng)常有香客問我殴蓬,道長,這世上最難降的妖魔是什么蟋滴? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任科雳,我火速辦了婚禮,結(jié)果婚禮上脓杉,老公的妹妹穿的比我還像新娘糟秘。我一直安慰自己,他們只是感情好球散,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布尿赚。 她就那樣靜靜地躺著,像睡著了一般蕉堰。 火紅的嫁衣襯著肌膚如雪凌净。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天屋讶,我揣著相機(jī)與錄音冰寻,去河邊找鬼。 笑死皿渗,一個(gè)胖子當(dāng)著我的面吹牛斩芭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播乐疆,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼划乖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了挤土?” 一聲冷哼從身側(cè)響起琴庵,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后迷殿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體儿礼,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年庆寺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蚊夫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡止邮,死狀恐怖这橙,靈堂內(nèi)的尸體忽然破棺而出奏窑,到底是詐尸還是另有隱情导披,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布埃唯,位于F島的核電站撩匕,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏墨叛。R本人自食惡果不足惜止毕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望漠趁。 院中可真熱鬧扁凛,春花似錦、人聲如沸闯传。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽甥绿。三九已至字币,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間共缕,已是汗流浹背洗出。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留图谷,地道東北人翩活。 一個(gè)月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像便贵,于是被迫代替她去往敵國和親隅茎。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

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