dubbo源碼分析(一)dubbo與spring的整合方式

?我們知道,在dubbo與spring的整合后,我們可以輕易的通過@Autowired引入bean并使用囱皿,那么問題來了,dubbo與spring內(nèi)部到底是怎么整合的呢忱嘹?

一嘱腥、拋出問題

1、dubbo的xml配置文件拘悦,bean對象時(shí)怎么導(dǎo)入到beanFactory中的齿兔?


2、我們知道,spring中bean的定義需要指定id分苇,dubbo中既然沒有id的屬性 添诉,也沒有Bean標(biāo)簽,那么注入到beanFactory中的beanId到底是什么医寿?


二栏赴、閱讀前需學(xué)的知識(shí)點(diǎn)

spring IOC中比較核心的知識(shí)點(diǎn)

BeanDefinition、InitializingBean ApplicationContextAware靖秩、ApplicationListener<ContextRefreshedEvent>, BeanNameAware


三须眷、開始學(xué)習(xí)

1、schema擴(kuò)展機(jī)制

程序設(shè)計(jì)原則中有一條非常重要的原則沟突,即開閉原則花颗,主要方便開發(fā)者做相應(yīng)的擴(kuò)展,spring在schema的設(shè)計(jì)上亦是如此惠拭。 spring提供了對schema的擴(kuò)展扩劝,開發(fā)者可以自己定義schema文件,并定義其相應(yīng)的解析器以及與spring ioc的集成求橄。

實(shí)現(xiàn)schema擴(kuò)展一般的步驟為:

1)定義xsd文件今野。 可以參考dubbo源碼中META-INF->dubbo.xsd,該文件定義了dubbo中所有的標(biāo)簽規(guī)范罐农,如:? dubbo:service条霜、dubbo:reference等等。

2)定義NamespaceHandler涵亏≡姿可以參考dubbo源碼中的DubboNamespaceHandler

3)定義BeanDefinitionParse,即Bean的解析器气筋。

4) 配置NameSpace對應(yīng)的xsd文件拆内。見META-INF->spring.shcemas文件。 本人對spring.shcemas文件沒有詳細(xì)的深究宠默,但是很容易發(fā)現(xiàn)麸恍,該文件再很多框架中都被用到了,比如:druid搀矫、apollo等等抹沪,spring框架中應(yīng)該會(huì)自動(dòng)加載該文件

5)配置NameSpace對應(yīng)的Handler類。見META-INF->spring.handlers瓤球。


spring源碼在這就不做相應(yīng)的分析融欧,在項(xiàng)目啟動(dòng)時(shí),spring會(huì)調(diào)用DubboNamespaceHandler中的init方法卦羡,注冊dubbo標(biāo)簽對應(yīng)的BeanDefinitionParser解析器以及其對應(yīng)的實(shí)現(xiàn)噪馏,比如:dubbo:application標(biāo)簽對應(yīng)的ApplicationConfig類麦到、dubbo:service標(biāo)簽對應(yīng)的ServiceBean類。

2欠肾、Bean的創(chuàng)建過程

? ? ? ?在上一節(jié)中瓶颠,我們定義不同標(biāo)簽對應(yīng)的不同實(shí)現(xiàn),本節(jié)我們將分析Bean的創(chuàng)建已經(jīng)我們最終的BeanName到底是什么董济。

? ? ? ?spring底層的源碼在這里不做詳細(xì)介紹步清,其實(shí)spring在解析Bean的時(shí)候會(huì)根據(jù)我們注冊到spring中不同標(biāo)簽對應(yīng)到不同BeanDefinitionParser做解析,比如dubbo的標(biāo)簽虏肾,對應(yīng)的解析器都是DubboBeanDefinitionParser類廓啊,spring中會(huì)調(diào)用類中的parse方法。我們拋開細(xì)節(jié)看一些關(guān)鍵的點(diǎn):

1)BeanDefinition封豪,dubbo底層其實(shí)還是基于spring的BeanDefinition來生成bean的谴轮。

2)BeanName名稱怎么定義的? 首先從標(biāo)簽中獲取id吹埠,id取不到第步,id取不到獲取name屬性,name屬性也為空的情況下缘琅,會(huì)獲取interface屬性粘都。賦值到id中


按照id類生成BeanDefinition。

那么現(xiàn)在看應(yīng)該就比較清晰了刷袍,dubbo:refrence對應(yīng)的beanId即為對應(yīng)的id屬性翩隧,而dubbo:service對應(yīng)的beanId就是它的interface屬性值。

3呻纹、ServiceBean源碼

serviceBean類其實(shí)是服務(wù)發(fā)布的核心類堆生,只看大概,核心怎么向注冊中心注冊服務(wù)的雷酪,后期再詳細(xì)介紹淑仆。

上一節(jié)我們介紹的,每個(gè)dubbo:service對應(yīng)的其實(shí)是一個(gè)創(chuàng)建ServiceBean的過程哥力,serviceBean實(shí)現(xiàn)了幾個(gè)重要的接口InitialzingBean蔗怠、BeanNameAware、ApplicationContextAware吩跋、ApplicationListener<ContextRefreshEvent>接口蟀淮。

其中afterPropertiesSet()方法、onApplicationEvent(ContextRefreshedEvent event)方法的實(shí)現(xiàn)都有想注冊中心注冊服務(wù)的邏輯钞澳,afterPropertiesSet是spring bean生命周期的一個(gè)過程(即為創(chuàng)建bean時(shí)候注冊),onApplicationEvent(ContextRefreshedEvent event)監(jiān)聽的ApplicationContext刷新(即在ApplicationContext刷新之后注冊)涨缚。? ? ?內(nèi)部是通過是否延遲加載來控制的轧粟,如果非延遲則在bean創(chuàng)建時(shí)注冊策治,如果延遲則在刷新spring上下文時(shí)注冊。? ? ?注冊的源碼在此章不做詳解兰吟。




因網(wǎng)上找了些文章通惫,有些細(xì)節(jié)的點(diǎn)沒有講到,比如beanId怎么定義的混蔼,所以擼了源碼后自己寫了一篇履腋。本人第一次寫,有寫的不好的地方還請指出惭嚣。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末遵湖,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子晚吞,更是在濱河造成了極大的恐慌延旧,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件槽地,死亡現(xiàn)場離奇詭異迁沫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)捌蚊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門集畅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人缅糟,你說我怎么就攤上這事挺智。” “怎么了溺拱?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵逃贝,是天一觀的道長。 經(jīng)常有香客問我迫摔,道長沐扳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任句占,我火速辦了婚禮沪摄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘纱烘。我一直安慰自己杨拐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布擂啥。 她就那樣靜靜地躺著哄陶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哺壶。 梳的紋絲不亂的頭發(fā)上屋吨,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天蜒谤,我揣著相機(jī)與錄音,去河邊找鬼至扰。 笑死鳍徽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的敢课。 我是一名探鬼主播阶祭,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼直秆!你這毒婦竟也來了濒募?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤切厘,失蹤者是張志新(化名)和其女友劉穎萨咳,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疫稿,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡培他,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了遗座。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舀凛。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖途蒋,靈堂內(nèi)的尸體忽然破棺而出猛遍,到底是詐尸還是另有隱情,我是刑警寧澤号坡,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布懊烤,位于F島的核電站,受9級(jí)特大地震影響宽堆,放射性物質(zhì)發(fā)生泄漏腌紧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一畜隶、第九天 我趴在偏房一處隱蔽的房頂上張望壁肋。 院中可真熱鬧,春花似錦籽慢、人聲如沸浸遗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽跛锌。三九已至,卻和暖如春届惋,著一層夾襖步出監(jiān)牢的瞬間察净,已是汗流浹背驾茴。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留氢卡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓晨缴,卻偏偏與公主長得像译秦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子击碗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356