Spring源碼分析筆記——bean

Spring****源碼分析筆記——bean

開始使用Spring框架后场仲,它的便捷易用色迂,強大初橘,給當年沒有使用任何框架,從頭到尾自己敲Java Web的我來說借卧,簡直到了天堂。

但由于對不能完全自己掌控的感覺的不爽筛峭,特別是在配置一個Spring項目時铐刘,需要各種摸索試錯。

于是影晓,誕生了閱讀Spring源碼镰吵,徹底對它滾瓜爛熟,有問題精準定位挂签,并熟練使用的偉大目標疤祭。。饵婆。勺馆。。侨核。草穆。。

在此搓译,列出幾個優(yōu)點來鼓舞自己堅持下去悲柱,,些己,豌鸡,,段标,涯冠,畢竟,它的源碼怀樟,有8000+文件功偿。盆佣。往堡。械荷。。

1虑灰、從閱讀源碼的過程中吨瞎,體會大神們的各種思想、技巧和編程規(guī)范穆咐。

2颤诀、對源碼和實現(xiàn)方法熟悉了以后,更好地使用对湃。

3崖叫、一個優(yōu)秀成熟的框架,必然有優(yōu)秀先進的技術(shù)拍柒,深入學習Java心傀。

4、看源碼的過程中可復習自己考過就忘的基礎(chǔ)知識點拆讯。

Spring****術(shù)語

EJB (Enterorise JavaBean) 企業(yè)級JavaBean

POJO (Plain Old Java Object) 簡單老式Java對象

DI (Dependency Injection) 依賴注入

AOP (Aspect-Oriented Programming) 面向切面編程

ORM (Object-Relational Mapping) 對象關(guān)系映射

JMS (Java Message Service) Java信息服務(wù)

MVC (Model - View - Controller) 模型-視圖-控制器

Spring基礎(chǔ)知識匯總 Java開發(fā)必看

從一個bean的初始化過程開始


Spring 框架最基礎(chǔ)來說, 是一個 DI(依賴注入) 框架. 我們把我們的程序中用到的實體對象, 也就是我們常說的 bean, 放在 Spring 框架中維護, 當我們用到這些 bean 的時候, 可以在程序的任何地方來獲取.

本文通過從頭到尾跟蹤分析代碼脂男,來查看一個bean的初始化的實現(xiàn)。

image.png

定義和注冊 bean

有4種方式定義和注冊bean:

方法一:xml 中來定義 bean 標簽

方法二:通過注解掃描, 比如 @Service 這種類.

方法三:定義 Configuration 類, 在類中提供 @Bean 的方法來定義.

方法四:使用純粹的 programmatically 的方式來定義和注冊.

在代碼中獲取bean的6種方式

方法一:在初始化時保存ApplicationContext對象

方法二:通過Spring提供的utils類獲取ApplicationContext對象

方法三:繼承自抽象類ApplicationObjectSupport

方法四:繼承自抽象類WebApplicationObjectSupport

方法五:實現(xiàn)接口ApplicationContextAware

方法六:通過Spring提供的ContextLoader

本文先分析第一種方式种呐。

在初始化時保存ApplicationContext對象

image.png

其中宰翅,userService在xml文件中的定義為:

image.png

那么~~開始吧~~~~~

ClassPathXmlApplicationContext****類:

image.png

這里為了簡化代碼,只展示了有關(guān)系的代碼爽室,這個類的全部代碼可自己去看~~~

其中汁讼,關(guān)于super關(guān)鍵字的具體了解可點擊查看:java中關(guān)鍵字 super表示的真正對象

Java中this和super的用法總結(jié)

<pre style="margin-left:21.0pt;mso-para-margin-left:2.0gd;background:white">可以看到這個類繼承了AbstractXmlApplicationContext類,那么接著看下去肮之。</pre>

AbstractXmlApplicationContext****類(抽象類):

image.png

AbstractRefreshableConfigApplicationContext****類(抽象類)

image.png

可以看到這個類繼承了AbstractRefreshableApplicationContext類掉缺,并實現(xiàn)了BeanNameAware和InitializingBean接口。

關(guān)于Java中的類和接口的不同戈擒,可點擊閱讀: Java 抽象類眶明、普通類、接口的區(qū)別——值得你一看的干貨 Java抽象類與接口的區(qū)別

其中筐高,Assert.noNullElements搜囱,是使用的Assert類的noNullElements方法,這個方法使用了@Deprecated注解柑土,表示這個方法將被棄用蜀肘,不建議使用。getEnvironment()方法在AbstractApplicationContext類中定義稽屏,會在這個類中詳細分析扮宠。

具體的Spring注解,可點擊查看:Spring常用注解介紹【經(jīng)典總結(jié)】

image.png

AbstractRefreshableApplicationContext****類(抽象類)

image.png

AbstractApplicationContext****類(抽象類)

終于到了主菜了狐榔,坛增,获雕,,1000+行的代碼收捣,需要從頭到尾慢慢理一理届案。

其中@Override注解,表示該方法是偽代碼,表示重寫(當然不寫也可以)罢艾,不過寫上有如下好處:

1楣颠、可以當注釋用,方便閱讀;

2咐蚯、編譯器可以驗證@Override下面的方法名是否是父類中所有的童漩,如果沒有則報錯。如果沒寫@Override春锋,而下面的方法名又寫錯了睁冬,這時編譯器是可以編譯通過的,因為編譯器以為這個方法是子類中自己增加的方法看疙。Java中@Override的作用

{@link}與@see的簡單使用以及區(qū)別--如何寫好Java代碼注釋豆拨。

為了由繁化簡,還是根據(jù)代碼的執(zhí)行思路來吧~~~

到了AbstractApplicationContext類能庆,終于沒有super(parent)了施禾,改成了如下:

image.png

PathMatchingResourcePatternResolver類

PathMatchingResourcePatternResolver可以用來解析資源文件,主要是用來解析類路徑下的資源文件搁胆。當然它也可以用來解析其它資源文件弥搞,如基于文件系統(tǒng)的本地資源文件。PathMatchingResourcePatternResolver在使用時可以直接new一個對象渠旁,new的時候可以通過使用帶ResourceLoader參數(shù)的構(gòu)造方法指定需要使用的ResourceLoader攀例,解析好了資源后獲取資源時需要通過ResourceLoader獲取。

PathMatchingResourcePatternResolver其實也是實現(xiàn)了ResourceLoader接口的顾腊≡撩空的構(gòu)造方法將使用DefaultResourceLoader獲取資源。大多數(shù)時候直接使用其空構(gòu)造函數(shù)即可杂靶。

image.png

在AbstractApplicationContext的setParent()方法中梆惯,instanceof 運算符是用來在運行時指出對象是否是特定類的一個實例。通過返回一個布爾值來指出吗垮,這個對象是否是這個特定類或者是它的子類的一個實例垛吗。

因為parent的值為null,所以這里不會運行里面的代碼烁登。

在前面怯屉,有個getEnvironment()函數(shù)的調(diào)用,在AbstractRefreshableConfigApplicationContext類中。下面锨络,分析這個函數(shù)蝗敢。

StandardEnvironment類繼承了AbstractEnvironment類,在AbstractEnvironment類中有resolveRequiredPlaceholders函數(shù):

image.png

image.png

繼續(xù)跟蹤下去:

這個函數(shù)在AbstractPropertyResolver類中定義:

image.png

Java 訪問權(quán)限控制:你真的了解 protected 關(guān)鍵字嗎足删?

SpringBoot環(huán)境屬性占位符解析和類型轉(zhuǎn)換

spring4.1.8擴展實戰(zhàn)之一:自定義環(huán)境變量驗證

未完待續(xù)。锁右。失受。。咏瑟。拂到。。码泞。兄旬。。余寥。领铐。。宋舷。绪撵。。祝蝠。音诈。。绎狭。细溅。。

看Spring源碼真是一個極其漫長的過程啊儡嘶。喇聊。。蹦狂。承疲。。鸥咖。燕鸽。。

參考資料:

Spring 的 bean 初始化過程

Spring源碼學習--AbstractApplicationContext(八)

Spring(26)——PathMatchingResourcePatternResolver

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末啼辣,一起剝皮案震驚了整個濱河市啊研,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖党远,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件削解,死亡現(xiàn)場離奇詭異,居然都是意外死亡沟娱,警方通過查閱死者的電腦和手機氛驮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來济似,“玉大人矫废,你說我怎么就攤上這事∨榇溃” “怎么了蓖扑?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長台舱。 經(jīng)常有香客問我律杠,道長,這世上最難降的妖魔是什么竞惋? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任柜去,我火速辦了婚禮,結(jié)果婚禮上拆宛,老公的妹妹穿的比我還像新娘诡蜓。我一直安慰自己,他們只是感情好胰挑,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布蔓罚。 她就那樣靜靜地躺著,像睡著了一般瞻颂。 火紅的嫁衣襯著肌膚如雪豺谈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天贡这,我揣著相機與錄音茬末,去河邊找鬼。 笑死盖矫,一個胖子當著我的面吹牛丽惭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辈双,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼责掏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了湃望?” 一聲冷哼從身側(cè)響起换衬,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤痰驱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瞳浦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體担映,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年叫潦,在試婚紗的時候發(fā)現(xiàn)自己被綠了蝇完。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡矗蕊,死狀恐怖短蜕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拔妥,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布达箍,位于F島的核電站没龙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏缎玫。R本人自食惡果不足惜硬纤,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赃磨。 院中可真熱鬧筝家,春花似錦、人聲如沸邻辉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽值骇。三九已至莹菱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吱瘩,已是汗流浹背道伟。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留使碾,地道東北人蜜徽。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像票摇,于是被迫代替她去往敵國和親拘鞋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

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