關(guān)于spring的spi技術(shù)

通過spring源碼的學(xué)習(xí),可以知道spring中擁有很多的拓展,其中有BeanDefinitionRegistryPostProcessor類型類的拓展


在spring加載的時(shí)候椒功,會(huì)去判斷是否擁有BeanDefinitionRegistryPostProcessor類型的類华烟,若是擁有則會(huì)執(zhí)行繼承這個(gè)類的postProcessBeanDefinitionRegistry()方法,以及postProcessBeanFactory()方法酿矢,其中在這兩個(gè)方法中榨乎,擁有參數(shù)BeanDefinitionRegistry(BeanDefinition注冊(cè)器),以及ConfigurableListableBeanFactory(bean工廠)瘫筐,一旦擁有了這兩個(gè)參數(shù)蜜暑,那咱們就能對(duì)spring容器進(jìn)行操作了。

大致講一下spring加載的一個(gè)流程策肝,在這就不細(xì)說了肛捍,細(xì)說的話隐绵,我覺得我可以碼一本小說了。(在此細(xì)說拙毫,僅僅是為了裝個(gè)小B)

首先spring加載的時(shí)候氢橙,會(huì)將匹配到的.class文件全都轉(zhuǎn)化為BeanDefinition,存放到一個(gè)集合中。即:beanDefinitionMap恬偷。


然后在beanfactory在getbean()的時(shí)候悍手,將beanDefinitionMap拿到,接著生成實(shí)例袍患,放到一個(gè)容器坦康,即:singletonObjects? ?可以將它稱為:一級(jí)緩存。

對(duì)于spring來說诡延,他的開閉原則是他的精髓思想滞欠,里面內(nèi)置了很多拓展,因此咱們可以利用這些拓展來對(duì)spring的ioc容器進(jìn)行操作肆良。比如:在還沒加入到ioc容器之前筛璧,咱們可以自定義一些BeanDefinition,通過BeanDefinition注冊(cè)器將它放入到BeanDefinition這個(gè)map中惹恃,這樣就能實(shí)現(xiàn)ioc的注入了夭谤。

另外在注解掃描的時(shí)候,有個(gè)特有的類巫糙,importselect朗儒,在掃描到的時(shí)候,也會(huì)執(zhí)行importselect方法参淹,我們也可以通過繼承importselect來實(shí)現(xiàn)BeanDefinition的注入醉锄。

既然有了能操作BeanDefinition注冊(cè)器,以及BeanFactory浙值,那接下來就可以通過讀取到配置文件中的內(nèi)容恳不,將它注入到ioc容器中了。

以下我會(huì)用三種方式去實(shí)現(xiàn)开呐。

在操作之前烟勋,先看一下配置文件的設(shè)置


第一種:操作postProcessBeanDefinitionRegistry()


第二種:操作postProcessBeanFactory()


因?yàn)樾枰O(shè)置beanName,考慮到首字母小寫负蚊,因此單獨(dú)拿出來一個(gè)方法去實(shí)現(xiàn)


這兩種方式神妹,都是通過操作同一個(gè)類的,只不過通過操作兩個(gè)方法去實(shí)現(xiàn)家妆,但是功能可以說是一樣的鸵荠,都是通過拿到配置文件的內(nèi)容,然后將它變?yōu)锽eanDefinition伤极,然后加入到beanfactory的BeanDefinition集合中蛹找。

第三種:


這個(gè)方法相對(duì)而言有點(diǎn)騷姨伤。主要用到@Import方法,通過拿到@import方法中的注解中的參數(shù)庸疾,拿到配置文件對(duì)應(yīng)的內(nèi)容乍楚,然后拿到類的全限定類名接著返回。

個(gè)人而言届慈,這種方式拓展性更強(qiáng)徒溪,可以通過jar包的方式,導(dǎo)入金顿,然后在自己項(xiàng)目中設(shè)置配置文件導(dǎo)入自己需要指定的的類臊泌。

接下來咱們看一下,這個(gè)@Import是在那使用的揍拆。這邊是用了一個(gè)注解去導(dǎo)入渠概。


通過這樣的方式導(dǎo)入,用來實(shí)現(xiàn)三種方式的spi技術(shù)嫂拴。這塊功能也完全可以將他變?yōu)橐粋€(gè)jar包播揪,導(dǎo)入到其他項(xiàng)目中使用。


通過一個(gè)簡(jiǎn)簡(jiǎn)單單的注解筒狠,就能實(shí)現(xiàn)了jar包項(xiàng)目中的類導(dǎo)入了猪狈。

有人可能會(huì)說:@ComponentScan注解不是更方便么?確實(shí)窟蓝,@ComponentScan這個(gè)注解很方便罪裹,而且也完全是無腦的,但是為啥我還要用這種spi的技術(shù)去實(shí)現(xiàn)的运挫。說實(shí)話:我就是為了裝逼。裝逼使我快樂套耕,裝逼使我開心谁帕,我裝逼,我驕傲冯袍。

有興趣的可以將這個(gè)項(xiàng)目拉下來看一下匈挖。

https://github.com/young287/spring_spi_demo 這個(gè)是項(xiàng)目地址。

https://github.com/young287/spring5.2.8_yuanma 這個(gè)是spring5.2.8源碼的地址康愤,里面是我學(xué)習(xí)了源碼以后儡循,在源碼里面寫的一些注解,有興趣的小伙伴也可以下載下來看看征冷。

一起努力吧择膝,咱們是目標(biāo)不是星辰大海,而是懟死面試官检激。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末肴捉,一起剝皮案震驚了整個(gè)濱河市腹侣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌齿穗,老刑警劉巖傲隶,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異窃页,居然都是意外死亡跺株,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門脖卖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乒省,“玉大人,你說我怎么就攤上這事胚嘲∽鞫” “怎么了?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵馋劈,是天一觀的道長(zhǎng)攻锰。 經(jīng)常有香客問我,道長(zhǎ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
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了算吩?” 一聲冷哼從身側(cè)響起留凭,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎偎巢,沒想到半個(gè)月后蔼夜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡压昼,尸身上長(zhǎng)有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
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)虐拓。三九已至洁桌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間侯嘀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工谱轨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留戒幔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓土童,卻偏偏與公主長(zhǎng)得像诗茎,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

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

  • 這是一篇純?cè)创a的文章敢订,可能有些枯燥王污,希望大家喜歡。不廢話 一楚午、源碼編譯 1.下載: git clone https...
    Java耕耘者閱讀 341評(píng)論 0 0
  • 本文是我自己在秋招復(fù)習(xí)時(shí)的讀書筆記昭齐,整理的知識(shí)點(diǎn),也是為了防止忘記矾柜,尊重勞動(dòng)成果阱驾,轉(zhuǎn)載注明出處哦!如果你也喜歡怪蔑,那...
    波波波先森閱讀 12,294評(píng)論 6 86
  • xxl-job如何保證定時(shí)任務(wù)只執(zhí)行一次 1里覆、業(yè)務(wù)邏輯代碼和定時(shí)任務(wù)邏輯完全分開部署2、調(diào)度框架集群(rehash...
    小丑的果實(shí)閱讀 1,014評(píng)論 0 0
  • Spring-IOC 1缆瓣、解析注冊(cè):使用Resource定位xml配置喧枷;使用BeanDefinitionReade...
    小丑的果實(shí)閱讀 376評(píng)論 0 0
  • 1.Spring整體架構(gòu) 1)核心容器(Core Container) Core模塊,主要包含了Spring框架基...
    Sponge1128閱讀 1,066評(píng)論 0 1