2.2 一顆豆子的經(jīng)歷--Bean的配置與實(shí)例化
本篇文章我們來(lái)介紹Bean的配置與實(shí)例化,讓我們先來(lái)看一顆豆子的故事:
??? 從前有一顆小豆子,準(zhǔn)確的來(lái)說(shuō),他自己也不知道自己是一顆怎樣的豆子。只是聽祖輩上講,它有一天會(huì)長(zhǎng)成一棵參天“大豆”。為了完成理想,他去找了農(nóng)民伯伯,但是農(nóng)民伯伯并不確定它是一顆怎樣的豆子,怎么能亂種呢?于是小豆子踏上了“證明自己的道路”。
一、小豆子的身份證---Bean的配置
??? 首先小豆子找到了植物研究中心,據(jù)說(shuō)任何植物的身世都可以查得到,順便也可以辦理一個(gè)身份證。小豆子抱著試試看的心態(tài)來(lái)到了這里,發(fā)現(xiàn)并不簡(jiǎn)單。這里豆子的命名是分全國(guó)性質(zhì)的和地區(qū)性質(zhì)的。小豆子也是頭一次聽說(shuō),在全國(guó)范圍內(nèi)來(lái)說(shuō),每一顆豆子一出生就會(huì)有一個(gè)編號(hào)(id),并附帶一個(gè)豆子名稱(name),還需要家庭住址(class),更有高級(jí)一點(diǎn)的豆子還會(huì)聲明一下自己適合生長(zhǎng)的區(qū)域(scope)。小豆子并不會(huì)搞這個(gè),它請(qǐng)工作人員來(lái)幫忙。工作人員告訴他,申請(qǐng)身份認(rèn)證就需要明確以上幾點(diǎn),科學(xué)一點(diǎn)的說(shuō)法是Bean的配置。
??? 其實(shí)在Spring中也一樣,我們要使用任何一個(gè)Bean對(duì)象都需要知道他的信息,也就是需要提前配置他們,一般情況下我們使用的是XML文件的配置方式。
?? 以下就是小豆子要要填寫的信息的介紹,我已經(jīng)為大家整理好了:

??? 那么地區(qū)性命名是怎么回事呢,原來(lái)在某一地區(qū)內(nèi)的豆子,當(dāng)?shù)卣紩?huì)詳細(xì)的記錄豆子屬性的值,包括姓名,年齡,性別,年齡等等。而這些賦值需要使用特殊的標(biāo)簽包裹起來(lái)【constructor-arg(構(gòu)造注入)、property(setter注入)】,還有的一個(gè)屬性又包含多個(gè)屬性,為了便于管理,他們把這種情況封裝成一個(gè)對(duì)象,整體進(jìn)行賦值(ref對(duì)象注入)。
??? 其實(shí),在Bean對(duì)象實(shí)現(xiàn)的每一個(gè)實(shí)體類中,都會(huì)存在這樣的現(xiàn)象,除了私有普通屬性使用還有私有對(duì)象屬性,用于在實(shí)體類體中調(diào)用該對(duì)象的方法。
??? 我也將這些屬性整理出了一張表格,大家可以看一下。

??? 了解了上述情況后,小豆子也是第一時(shí)間辦好了一張身份證,讓我們來(lái)看一下(setter方法注入):
二、小豆子上戶口---Bean的實(shí)例化
??? 光辦理好身份證了,還不能證明自己是自己,還需要在戶籍網(wǎng)站上注冊(cè)一下。這里注冊(cè)戶口的方式有三種,一種是自己在家自己登錄網(wǎng)站注冊(cè)(構(gòu)造方法實(shí)例化)、一種是通過(guò)中介注冊(cè)戶口(實(shí)例工廠實(shí)例化)、最后一種就是現(xiàn)場(chǎng)找工作人員辦理(靜態(tài)工廠實(shí)例化)。為了了解哪一種方式最為準(zhǔn)時(shí),小豆子也是做了很全面的功課呢,讓我們一起來(lái)看看都做了那些功課吧:
1、構(gòu)造方法實(shí)例化
??? 首先小豆子了解的就是構(gòu)造方法實(shí)例化,他指的就是通過(guò)對(duì)應(yīng)Bean對(duì)象的實(shí)現(xiàn)類中的無(wú)參構(gòu)造方法來(lái)實(shí)例化Bean。由于可以不借助外來(lái)力量就可以完成實(shí)例化,這里形象的解釋為網(wǎng)上注冊(cè)。
(1)首先需要在pom.xml中導(dǎo)入相關(guān)依賴
2、創(chuàng)建一個(gè)Bean的實(shí)現(xiàn)類,里面定義一個(gè)方法,用于顯示內(nèi)容
3、創(chuàng)建配置文件applicationContext.xml,使用構(gòu)造方法實(shí)例化Bean對(duì)象
4、編寫實(shí)現(xiàn)類BeanTest,測(cè)試實(shí)例化是否完成
5、運(yùn)行測(cè)試類,查看結(jié)果

??? 這樣看來(lái),自己在家注冊(cè)戶口也不難嘛。但是小豆子可是兜兜里不缺錢的那種,非得看看找中介能不能更方便一些。
2、實(shí)例工廠實(shí)例化
小豆子想了解一下中介是怎樣幫忙注冊(cè)戶口的,于是打給一個(gè)有名的中介打了一個(gè)電話,了解到中介的操作步驟如下:
(1)在pom.xml中導(dǎo)入依賴(和構(gòu)造實(shí)例化相同)
(2)創(chuàng)建實(shí)現(xiàn)類Bean,編寫一個(gè)方法用于顯示信息
(3)創(chuàng)建BeanFactory類(中介類),用于創(chuàng)建Bean的實(shí)例化對(duì)象。
(4)創(chuàng)建配置文件applicationContext.xml,用于聲明Bean對(duì)象實(shí)例,Bean工廠實(shí)例,以及創(chuàng)建Bean的關(guān)系。
(5)編寫測(cè)試類,查看運(yùn)行結(jié)果

??? 小豆子一看,貌似找中介還更加麻煩一些呢!而且把數(shù)據(jù)交給中介,還會(huì)有數(shù)據(jù)泄露的風(fēng)險(xiǎn),還是算了吧。小豆子打算去現(xiàn)場(chǎng)找工作人員問(wèn)一下,于是便有了下面的流程:
3、靜態(tài)工程實(shí)例化
(1)在pom.xml中導(dǎo)入依賴(和構(gòu)造實(shí)例化相同)
(2)創(chuàng)建實(shí)現(xiàn)類Bean,編寫一個(gè)方法用于顯示信息
(3)創(chuàng)建BeanFactory類(政府類),寫一個(gè)靜態(tài)方法用于創(chuàng)建Bean的實(shí)例化對(duì)象。
(4)創(chuàng)建配置文件applicationContext.xml,這里只用聲明BeanFactory實(shí)例化對(duì)象(政府),調(diào)用其中的方法進(jìn)行Bean額實(shí)例化對(duì)象。
(5)編寫測(cè)試類,運(yùn)行結(jié)果:

來(lái)都來(lái)啦,那就在這里找工作人員辦理吧,小豆子最終成功的辦理了戶口注冊(cè)。
三、小豆子有話說(shuō)---三種實(shí)例化的流程比較
1、配置方面的區(qū)別
構(gòu)造方法:
(1)創(chuàng)建實(shí)體類時(shí),需要?jiǎng)?chuàng)建對(duì)應(yīng)的無(wú)參構(gòu)造
(2)需要?jiǎng)?chuàng)建對(duì)應(yīng)的setter方法
(3)XMl配置文件中只需配置實(shí)體的bean
(4)測(cè)試類中使用Spring容器獲取對(duì)象,用獲取到的對(duì)象調(diào)用相應(yīng)的方法。
實(shí)例化工廠
(1)需要創(chuàng)建對(duì)應(yīng)的工廠類,使用工廠對(duì)象用來(lái)創(chuàng)建實(shí)體.
(2)xml配置文件里需要同時(shí)配置bean,和beanFactory的bean類型.
其中實(shí)體Bean需要聲明工廠對(duì)象,工廠對(duì)象需要聲明所使用的方法。
<bean id="beanFactory" class="com.hdc.bean.BeanFactory"></bean>
? ? <bean id="bean1" factory-bean="beanFactory" factory-method="createBean"></bean>
(3)在測(cè)試類中,通過(guò)spring容器獲取的仍然是原實(shí)體類的Bean對(duì)象,使用實(shí)體對(duì)象調(diào)用相應(yīng)的方法。
靜態(tài)工廠:
(1)需要創(chuàng)建對(duì)應(yīng)的靜態(tài)工廠類,用來(lái)創(chuàng)建實(shí)體.
(2)xml文件對(duì)應(yīng)配置,需要聲明實(shí)體Bean對(duì)象,聲明工廠對(duì)象及所需要調(diào)用的方法。
<bean id="bean1" class="com.hdc.bean.BeanFactory" factory-method="beanCreate"></bean>
(3)在測(cè)試類中,獲取的是工廠Bean對(duì)象,通過(guò)工廠對(duì)象創(chuàng)建實(shí)體對(duì)象,并使用實(shí)體對(duì)象調(diào)用相應(yīng)的方法。
2、三種實(shí)例化流程
1》,使用類構(gòu)造方法實(shí)例化(無(wú)參構(gòu)造函數(shù))
(1)獲取spring容器,找到對(duì)應(yīng)的Bean
(2)根據(jù)id值找到對(duì)應(yīng)的Bean對(duì)象
(3)通過(guò)id值和實(shí)現(xiàn)類找到Bean,通過(guò)調(diào)用其構(gòu)造方法,實(shí)現(xiàn)對(duì)象的創(chuàng)建
(4)使用創(chuàng)建好的實(shí)體對(duì)象調(diào)用對(duì)象方法。

2》使用靜態(tài)工廠方法實(shí)例化
(1)從Spring容器中獲取Bean對(duì)象
(2)配置實(shí)現(xiàn)類,創(chuàng)建beanFactory工廠對(duì)象
(3)調(diào)用工廠對(duì)象的BeanCreate方法,用于創(chuàng)建一個(gè)新的對(duì)象。
(4)使用BeanCreate方法創(chuàng)建一個(gè)實(shí)體對(duì)象
(5)通過(guò)調(diào)用BeanFactory對(duì)象間接創(chuàng)建實(shí)體對(duì)象。
(6)使用創(chuàng)建好的實(shí)體對(duì)象調(diào)用實(shí)體對(duì)象的方法。

3》使用實(shí)例工廠方法實(shí)例化
(1)從spring容器中獲取Bean對(duì)象
(2)通過(guò)Bean表示找到對(duì)應(yīng)的Bean對(duì)象
(3)通過(guò)id值找到已經(jīng)配置的Bean實(shí)例化工廠對(duì)象
(4)通過(guò)實(shí)現(xiàn)類找到對(duì)應(yīng)的實(shí)例化BeanFactory類
(5)根據(jù)工廠方法標(biāo)簽確定使用哪種工廠方法
(6)執(zhí)行所選的工廠方法,創(chuàng)建對(duì)應(yīng)的實(shí)體對(duì)象
(7)實(shí)體對(duì)象創(chuàng)建完成,在測(cè)試類中使用getBean方法獲取創(chuàng)建好的實(shí)體對(duì)象。
(8)使用創(chuàng)建好的實(shí)體對(duì)象調(diào)用相應(yīng)的方法

???? 其實(shí)我們形象化的比喻是根據(jù)xml配置文件來(lái)講的,靜態(tài)工廠實(shí)例化的時(shí)候旨在xml里面配置了工廠類Bean對(duì)象,使用其自身的方法進(jìn)行Bean對(duì)象的創(chuàng)建,所以類比做工作人員用自身的系統(tǒng)注冊(cè)戶口。而實(shí)例化工廠在配置的時(shí)候配置了兩個(gè)Bean對(duì)象,一個(gè)是需要?jiǎng)?chuàng)建的實(shí)體類Bean對(duì)象,另一個(gè)是工廠類Bean對(duì)象(中介)。首先需要聲明工廠類對(duì)象(中介),并聲明實(shí)現(xiàn)類(地址)。然后再聲明實(shí)體類Bean對(duì)象,并用factory-bean標(biāo)簽聲明時(shí)用到的工廠類Bean對(duì)象(找的是哪一家中介),再使用factory-method確定使用工廠類的什么方法(需要辦理什么業(yè)務(wù)),流程都是差不多的,只不過(guò)是方式不同方式不同罷了。

小豆子的故事就告一段落了,不知道大家喜不喜歡這種敘述風(fēng)格,如果喜歡的話,我們會(huì)繼續(xù)書結(jié)下回,繼續(xù)小豆子的故事。
歡迎大家對(duì)文章中的錯(cuò)誤進(jìn)行評(píng)論指正,關(guān)注我,一起學(xué)習(xí)Spring一起進(jìn)步。