用40個類手寫spring ioc和aop

開篇先上一張,工程圖片:


image.png

這篇文章已經(jīng)拖了好久了被芳,剛好最近有點時間缰贝,終于開搞了。spring 的ioc 和aop作為spring的重要功能畔濒,相信大家都已經(jīng)很熟悉了剩晴。
下面再簡單的介紹一下:

IOC : 全稱 Inversion of control , 翻譯為控制反轉(zhuǎn),還有一個別名di (Dependency injection) 即依賴注入侵状。 由容器來負責對象的生命周期和對象之間的關(guān)系赞弥,在沒有spring之前,對象的創(chuàng)建和注入都是都開發(fā)人員保證的趣兄,有了ioc 之后绽左, 都交由容器來操作。

AOP: Aspect Oriented programming 面向切面編程艇潭,在程序開發(fā)中用來解決一些系統(tǒng)層面的問題拼窥,比如 日志 事物 權(quán)限等。 降低代碼的侵入性蹋凝,執(zhí)行一些與業(yè)務(wù)無關(guān)的邏輯鲁纠。

接下來用張圖來看下,spring ioc 的運行原理圖:

spring ioc.jpg

整個流程鳍寂,大致分為如下的幾部:

  • 資源定位: spring會解析項目中的xml改含,注解,java,自動裝配的配置信息迄汛,使用ClassLoader 加載到內(nèi)存中候味,為解析做準備
  • 配置元信息的解析:spring會解析這些配置文件,并存放到容器中隔心,使用Map進行保存,配置的元信息被解析為BeanDefinition類
  • 創(chuàng)建Bean的實例 : spring根據(jù)解析到的BeanNames , 采用循環(huán)遍歷的方式尚胞,進行bean的創(chuàng)建操作疮绷,創(chuàng)建步驟分為了三部分归斤,bean的實例化(依據(jù)掃描到的Class信息進行創(chuàng)建),Bean的初始化完成屬性的注入寂拆,
  • 執(zhí)行BeanPostProcessor后置處理器,執(zhí)行 postProcessBeforInstantiation()方法和PostProcessAfterInstantiation()方法诸尽,切面中方法的織入也是在該步驟中執(zhí)行的,下面會進行介紹

spring aop 實現(xiàn)

spring aop .jpg

切面類的織入是在初始化完成之后,執(zhí)行BeanProcessor的時候抽减,完成的。具體的流程參考圖片橄碾,此處就不再贅述了卵沉。

下面看下spring的高級特性:

1.獲取Spring IOC 容器(Aware)

通過ApplicationContextAware實現(xiàn),在bean實例化后法牲,經(jīng)過Aware掃描時史汗,發(fā)現(xiàn)實現(xiàn)了ApplicationContextAware接口,就會調(diào)用setApplicationContext方法注入applicationcontext對象拒垃,這也是非常經(jīng)典的一種獲取上下文的方法停撞。

2.動態(tài)注冊Bean信息(BeanDefinitionRegistryPostProcessor)

通過實現(xiàn)BeanDefinitionRegistryPostProcessor接口完成bean的動態(tài)注入, 動態(tài)注入Bean非常的簡單悼瓮,獲取到當前容器后戈毒,然后調(diào)用registerBeanDefinition既可。

3.動態(tài)修改bean信息(BeanFactoryPostProcessor)

4.自定義工廠bean實例化 (AbstractFacotryBean)

5.通過Spring事件機制完成服務(wù)啟動后的信息整理(ApplicationListener)

6.服務(wù)啟動完成后初始化任務(wù)(CommandLineRuner)

最后的最后横堡,上我手寫的源碼地址:https://github.com/topyuluo/spring-project

盡量保留了spring的設(shè)計原理和思想埋市,希望對理解源碼有幫助。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末翅萤,一起剝皮案震驚了整個濱河市恐疲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌套么,老刑警劉巖培己,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異胚泌,居然都是意外死亡省咨,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門玷室,熙熙樓的掌柜王于貴愁眉苦臉地迎上來零蓉,“玉大人,你說我怎么就攤上這事穷缤〉蟹洌” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵津肛,是天一觀的道長章喉。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么秸脱? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任落包,我火速辦了婚禮,結(jié)果婚禮上摊唇,老公的妹妹穿的比我還像新娘咐蝇。我一直安慰自己,他們只是感情好巷查,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布有序。 她就那樣靜靜地躺著,像睡著了一般吮便。 火紅的嫁衣襯著肌膚如雪笔呀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天髓需,我揣著相機與錄音许师,去河邊找鬼。 笑死僚匆,一個胖子當著我的面吹牛微渠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播咧擂,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼逞盆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了松申?” 一聲冷哼從身側(cè)響起云芦,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贸桶,沒想到半個月后舅逸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡皇筛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年琉历,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片水醋。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡旗笔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拄踪,到底是詐尸還是另有隱情蝇恶,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布惶桐,位于F島的核電站艘包,受9級特大地震影響的猛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜想虎,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望叛拷。 院中可真熱鬧舌厨,春花似錦、人聲如沸忿薇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽署浩。三九已至揉燃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間筋栋,已是汗流浹背炊汤。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留弊攘,地道東北人抢腐。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像襟交,于是被迫代替她去往敵國和親迈倍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348