BeanNameAware 接口和 BeanFactoryAware 接口

迄今為止,所接觸到的Bean都是“無知覺”的,就像黑客帝國中機(jī)械工廠里面“養(yǎng)殖”的人類,他們雖然能完成一定的功能,但是根本不知道自己在工廠(BeanFactory)中的代號(id),或者自己是在哪個(gè)工廠(BeanFactory的引用)中沉睡。所以,本節(jié)的目的就是要?jiǎng)?chuàng)造出一個(gè)尼奧一樣的Bean,讓他知道自己在工廠中的id和自己原來躺在哪個(gè)工廠中。

這里,稱之為,Bean對Spring有知覺。

但是有言在先,如果要在Spring容器中做到這兩點(diǎn),當(dāng)然,可以自己通過某些方法實(shí)現(xiàn),代價(jià)是大量冗余代碼,好處是跟Spring解耦。

如果使用Spring提供的接口,好處當(dāng)然減少代碼的規(guī)模,“缺點(diǎn)”(如果算的話)是與Spring耦合。

總之,無論采取那種辦法還是要看實(shí)際需要。


BeanNameAware 讓Bean對Name有知覺

作用:讓Bean獲取自己在BeanFactory配置中的名字(根據(jù)情況是id或者name)。

額外說明:Spring自動(dòng)調(diào)用。并且會(huì)在Spring自身完成Bean配置之后,且在調(diào)用任何Bean生命周期回調(diào)(初始化或者銷毀)方法之前就調(diào)用這個(gè)方法。換言之,在程序中使用BeanFactory.getBean(String beanName)之前,Bean的名字就已經(jīng)設(shè)定好了。所以,程序中可以盡情的使用BeanName而不用擔(dān)心它沒有被初始化。

當(dāng)然,Bean之中一定要有個(gè)String類型變量來保存BeanName的值,這個(gè)是在編寫B(tài)ean代碼時(shí)有程序員手工完成的,而不是通過什么特殊的餓配置。

通常都是為了更好的餓配置Log,但是請注意,不要只是因?yàn)榕浜螸og就把bean那么中添加任何業(yè)務(wù)含義,否則會(huì)讓你自己的類關(guān)聯(lián)到某個(gè)Spring特性上去,而它帶來的好處卻是微不足道的。如果確實(shí)需要Bean帶有某種內(nèi)部名稱,那么最好讓Bean自己實(shí)現(xiàn)某個(gè)方法,例如setName(),然后使用DI給每個(gè)Bean注入一個(gè)名字,這樣技能保持配置Bean的名字仍然能夠簡潔,且你也無需修改自己的配置文件,好讓Bean的名字帶有業(yè)務(wù)含義。


BeanFactoryAware 讓Bean對工廠有知覺

作用:讓Bean獲取配置他們的BeanFactory的引用。

實(shí)現(xiàn):實(shí)現(xiàn)BeanFactoryAware接口,其中只有一個(gè)方法即setFactory(BeanFactory factory)。使用上與BeanNameAware接口無異,只不過BeanFactoryAware注入的是個(gè)工廠,BeanNameAware注入的是個(gè)Bean的名字。

額外說明:雖然原書中并未提及setFactory()方法的調(diào)用時(shí)機(jī),但是可以猜想到,這個(gè)方法可能是在根據(jù)某個(gè)配置文件創(chuàng)建了一個(gè)新工廠之后,Spring才調(diào)用這個(gè)方法,并把BeanFactory注入到Bean中。

讓bean獲取配置自己的工廠之后,當(dāng)然可以在Bean中使用這個(gè)工廠的getBean()方法,但是,實(shí)際上非常不推薦這樣做,因?yàn)榻Y(jié)果是進(jìn)一步加大Bean與Spring的耦合,而且,能通過DI注入進(jìn)來的盡量通過DI來注入。
當(dāng)然,除了查找bean,BeanFactory可以提供大量其他的功能,例如銷毀singleton模式的Bean。

補(bǔ)充說明:
factory.preInstantiateSingletons();方法。preInstantiateSingletons()方法立即實(shí)例化所有的Bean實(shí)例,有必要對這個(gè)方法和Spring加載bean的機(jī)制做個(gè)簡單說明。

方法本身的目的是讓Spring立即處理工廠中所有Bean的定義,并且將這些Bean全部實(shí)例化。因?yàn)镾pring默認(rèn)實(shí)例化Bean的情況下,采用的是lazy機(jī)制,換言之,如果不通過getBean()方法(BeanFactory或者ApplicationContext的方法)獲取Bean的話,那么為了節(jié)省內(nèi)存將不實(shí)例話Bean,只有在Bean被調(diào)用的時(shí)候才實(shí)例化他們。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,345評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,494評論 3 416
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,283評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,953評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,714評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,410評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,940評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,776評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,976評論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,210評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,654評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,958評論 2 373

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

  • Spring簡介 spring框架由Rod Johnson開發(fā),2004年發(fā)布了Spring框架的第一版。Spri...
    qiuqiu_hz閱讀 1,080評論 0 15
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,898評論 6 342
  • 如下是整篇文章的結(jié)構(gòu),所需閱讀時(shí)間大約20min Spring簡介 Spring框架由Rod Johnson開發(fā),...
    李序鍇閱讀 903評論 0 15
  • 細(xì)語憑欄念,相思日月新。參差煙柳數(shù)星辰,風(fēng)月俏佳人。 永駐常青樹,驚鴻繞側(cè)身。許我一次駕香輪,醉舞踏青春。
    醉舞踏青春閱讀 166評論 0 0
  • 阿九喜歡阿若,從20歲那年開始。 阿若不喜歡阿九,從認(rèn)識的那年就是。 阿九和阿若...
    林梓小夕閱讀 654評論 0 2