亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring之詳解bean的實(shí)例化

 更新時(shí)間:2023年01月16日 17:22:32   作者:續(xù)寫(xiě)青春.  
這篇文章主要介紹了Spring之詳解bean的實(shí)例化,文章內(nèi)容詳細(xì),簡(jiǎn)單易懂,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

bean實(shí)例化

bean的基礎(chǔ)配置

在學(xué)習(xí)bean的實(shí)例化之前,我們先來(lái)學(xué)習(xí)bean該如何配置。

在bean的配置這一塊,我們將學(xué)習(xí)三塊內(nèi)容,分別為:我們先來(lái)看一下bean的基礎(chǔ)配置bean基礎(chǔ)配置、bean別名配置、bean作用范圍配置。

id用來(lái)定義bean的名稱,通過(guò)它可以獲取,class用來(lái)指定bean的類型,也就是你造出來(lái)的bean究竟是哪一個(gè)類的

那么這個(gè)時(shí)候就有一個(gè)問(wèn)題了,對(duì)應(yīng)的bean的id你寫(xiě)好了,但是你的命名習(xí)慣和我的命名習(xí)慣不一樣,我不想叫這個(gè)名稱,有沒(méi)有辦法呢,這就是有關(guān)bean可以起多個(gè)名稱,也就是所謂的bean的別名。

  • 接下來(lái)我們來(lái)看bean的別名配置,在學(xué)習(xí)之前,我們先來(lái)交代一下當(dāng)前的程序環(huán)境

service層接口????

service層實(shí)現(xiàn)類????

dao層接口????

dao層實(shí)現(xiàn)類????

applicationContext.xml配置文件????

主方法????

  • 在了解了程序環(huán)境以后,我們開(kāi)始來(lái)學(xué)習(xí)別名配置????。

我們知道bean的別名肯定是寫(xiě)在applicationContext.xml配置文件中的 ,怎么寫(xiě)呢,在配置的 bean中,有一個(gè)name屬性,可以為這個(gè)bean指定更多的名稱????。

注意:別名可以有多個(gè),使用逗號(hào),分號(hào),或者空格進(jìn)行分隔。

當(dāng)我們?cè)谥鞣椒ㄖ袑etBean()方法里邊的參數(shù)改為我們配置的別名,我們會(huì)發(fā)現(xiàn)程序還可以正常運(yùn)行,那就說(shuō)明我們配置的別名是有效的。????

接下來(lái)我們思考:我們?cè)诮壎╯ervice與dao的關(guān)系時(shí),在service層配置的bean里邊有一個(gè)屬性ref表示的是參照dao層配置的bean,屬性值為dao層配置的bean的屬性id,那么如果我們將ref這個(gè)屬性改為我們?cè)赿ao層配置的bean的別名,那么程序還可以正常運(yùn)行嗎?我們來(lái)演示一下????

通過(guò)以上演示,我們可以得知?jiǎng)e名的作用范圍是很大的??雖然我們學(xué)習(xí)了用別名配置bean的方式,但是還是建議我們r(jià)ef參照的時(shí)候,還是引用id屬性????。

  • 接下來(lái)需要說(shuō)一說(shuō)我們需要注意的問(wèn)題了????

回到我們的主方法中,我們現(xiàn)在在getBean()方法中傳遞進(jìn)去一個(gè)我們沒(méi)有的參數(shù)service5,這是在配置的service的bean中的id屬性和name屬性都沒(méi)有的參數(shù),那我們運(yùn)行的話會(huì)有什么問(wèn)題呢????

運(yùn)行完會(huì)報(bào)出一個(gè)異常,這個(gè)異常的意思就是沒(méi)有一個(gè)這樣的bean被定義,如果以后我們遇到這個(gè)異常的話,只需要檢查我們的名字就行了????

  • bean的別名配置我們已經(jīng)說(shuō)完了,接下來(lái)我們來(lái)學(xué)習(xí)bean的作用范圍????

什么叫bean的作用范圍呢?其實(shí)就是你現(xiàn)在創(chuàng)建的bean的究竟是一個(gè)對(duì)象還是多個(gè)對(duì)象,什么意思呢,其實(shí)就是說(shuō)你造的對(duì)象是單例的還是非單例的,我們先來(lái)看看如下代碼????

我們獲取到BookDao的對(duì)象,并且打印它的地址????

那我們將以上代碼復(fù)制兩份并且分別打印它們的地址,會(huì)出現(xiàn)什么結(jié)果呢????

通過(guò)運(yùn)行結(jié)果我們可以發(fā)現(xiàn),兩次打印的結(jié)果是同一個(gè)地址,那么它們也可以認(rèn)為是同一個(gè)對(duì)象了

由此得出:Spring默認(rèn)給我們創(chuàng)建的bean是單例的,那么這時(shí)候就有新問(wèn)題了,如果我想要?jiǎng)?chuàng)建一個(gè)非單例的該怎么辦,這個(gè)時(shí)候就要通過(guò)配置的方法解決這個(gè)問(wèn)題了????

如下,我們?cè)赿ao層配置的bean后邊再加一個(gè)屬性scope,就是作用范圍的意思

里邊有兩個(gè)值,一個(gè)singleton表示單例的,一個(gè)prototype表示非單例的,不寫(xiě)的話,默認(rèn)是signleton,我們?cè)O(shè)置scope屬性為prototype,來(lái)看看運(yùn)行結(jié)果????

通過(guò)運(yùn)行結(jié)果我們可以得出,此時(shí)的所創(chuàng)建的兩個(gè)對(duì)象是不同的,注意:我們上面所框出的是對(duì)象的哈希值,不是對(duì)象的地址但是可以當(dāng)做是對(duì)象的地址??

  • 在學(xué)完bean的作用范圍,我們可以認(rèn)為它是可以控制創(chuàng)建的bean是一個(gè)或者是多個(gè)的,那么新的問(wèn)題來(lái)了,為什么bean默認(rèn)是單例的?

我們來(lái)解釋一下,對(duì)于Spring來(lái)說(shuō),它幫我們管理的bean要放到它的容器中,我們 假定一個(gè)場(chǎng)景,如果它造出來(lái)的bean不是非單例的,那么這個(gè)bean的數(shù)量會(huì)有多少呢?

它會(huì)無(wú)窮無(wú)盡,用一次造一個(gè),所以說(shuō)Spring它并不是幫我們管理這一類bean的

這樣的話,對(duì)Spring容器來(lái)說(shuō)也有一個(gè)非常大的壓力,那Spring幫我們管理的bean都是單例的,那會(huì)對(duì)我們的業(yè)務(wù)造成傷害嗎

你想一想,你造一個(gè)dao對(duì)象,執(zhí)行完一個(gè)方法,下一次你又需要造一個(gè)dao對(duì)象,再執(zhí)行另一個(gè)方法,那我這兩個(gè)對(duì)象用同一個(gè)不行嗎?

好像沒(méi)有什么問(wèn)題,就是這個(gè)原因,Spring容器在幫我們管理對(duì)象的時(shí)候其實(shí)就是在管理那些你可以復(fù)用的對(duì)象,就是這個(gè)對(duì)象你用一次,下一次還用它,所以你下次還會(huì)從容器中拿,這樣它的效率才會(huì)更高一些,

因此,它就簡(jiǎn)單一點(diǎn),給你造的bean就是單例的??。

  • 那么新的問(wèn)題有又來(lái)了,哪些bean適合造單例的呢?

我們的表現(xiàn)層對(duì)象,比如說(shuō)我們現(xiàn)在寫(xiě)的Servlet,業(yè)務(wù)層對(duì)象, Service,數(shù)據(jù)層對(duì)象,Dao,或者還有一些工具類的對(duì)象,這些對(duì)象,你造一次就ok了,就這個(gè)對(duì)象我可以反復(fù)用,這些東西交給Spring管理????。

  • 那哪些東西不適合交給Spring管理呢?

封裝實(shí)體的域?qū)ο蟛贿m合交給Spring管理,因?yàn)樗镞厱?huì)記錄一些它的成員變量的一些屬性值,到這里我們就知道了bean的作用范圍是控制我們bean創(chuàng)建的實(shí)例的數(shù)量的????。

bean的實(shí)例化-構(gòu)造方法

上面我們學(xué)習(xí)完了bean的基礎(chǔ)配置,那就有人問(wèn)了,我們的這個(gè)單例bean是如何造出來(lái)的呢,和我們以前的寫(xiě)法一樣嗎,也是用new的方式造出來(lái)的嗎,我們現(xiàn)在就來(lái)學(xué)習(xí)bean的實(shí)例化-構(gòu)造方法實(shí)例化的方式????。

對(duì)于bean來(lái)說(shuō),其本質(zhì)是對(duì)象,在前面我們說(shuō)過(guò),我們將容器中管理的對(duì)象叫做bean,我們以前創(chuàng)造對(duì)象是怎么寫(xiě):new跟構(gòu)造方法,對(duì)于Spring來(lái)說(shuō),它也是通過(guò)構(gòu)造方法來(lái)完成bean的創(chuàng)建的,一起來(lái)看一下????

 以上是我們程序的環(huán)境????,接下來(lái)我們來(lái)說(shuō)以前我們?cè)鞂?duì)象new+構(gòu)造方法,對(duì)于Spring來(lái)說(shuō),同樣的道理,它也是用構(gòu)造方法來(lái)造對(duì)象的。

 接下來(lái)我們?cè)赿ao的實(shí)現(xiàn)類中生成構(gòu)造方法,并且在構(gòu)造方法中打印一句話????

什么都不動(dòng),我們?cè)賮?lái)運(yùn)行一下,看看這句話執(zhí)行了沒(méi)有,如果執(zhí)行了,那就意味著Spring容器調(diào)用了構(gòu)造方法造對(duì)象????

結(jié)果是用了,造對(duì)象都得用構(gòu)造方法,在這說(shuō)一個(gè)東西,我們將構(gòu)造方法的權(quán)限修飾符改為private,我們說(shuō)如果以前我們寫(xiě)程序,把構(gòu)造方法私有化以后,我們?cè)谕膺呥€可以造對(duì)象嗎?顯然是絕對(duì)造不出來(lái)的

結(jié)果是不是出人意料啊,Spring還可以調(diào)用它的構(gòu)造方法

那就說(shuō)明了一點(diǎn),Spring確實(shí)是通過(guò)構(gòu)造方法來(lái)造對(duì)象的,而且不管是公共的還是私有的它都能調(diào)到,我們可以猜到它的內(nèi)部是怎么回事嗎,私有的東西它居然可以訪問(wèn),怎么做的

是通過(guò)反射,后邊我們?cè)趯W(xué)習(xí)一些內(nèi)部工作原理的時(shí)候,我們?cè)賮?lái)學(xué)習(xí)它,現(xiàn)在只需要知道它是通過(guò)構(gòu)造方法造對(duì)象的就可以了

但是這個(gè)時(shí)候就有人提出來(lái)了一個(gè)問(wèn)題,那萬(wàn)一給它加一個(gè)參數(shù)呢?????

我們來(lái)試一試,并且運(yùn)行一下,會(huì)發(fā)現(xiàn)它已經(jīng)不能正常運(yùn)行了????,這就說(shuō)明了一點(diǎn),Spring在創(chuàng)建bean的時(shí)候,調(diào)用的是無(wú)參構(gòu)造方法,到這里我們就學(xué)習(xí)完了第一種實(shí)例化bean的方式,就是用構(gòu)造方法來(lái)實(shí)例化對(duì)象??

bean的實(shí)例化-靜態(tài)工廠

  • 前面我們學(xué)習(xí)了用構(gòu)造方法來(lái)實(shí)例化bean,接下來(lái)我們來(lái)說(shuō)第二種方式,在學(xué)習(xí)第二種方式之前
  • 我們先來(lái)回顧一個(gè)東西,我們?cè)谇斑呏v過(guò),用工廠也可以造對(duì)象,我們先來(lái)看看程序環(huán)境????

  • 接下來(lái)我提供了一個(gè)工廠類????

  • 如果用這個(gè)來(lái)寫(xiě)的話,會(huì)是什么樣子的呢?接下來(lái)我們來(lái)看一下

先去使用工廠去獲得這個(gè)對(duì)象,然后去運(yùn)行,我們?nèi)ミ\(yùn)行一下????

我們發(fā)現(xiàn)這是可以運(yùn)行的,其實(shí)這是早些年做程序的一個(gè)常用的方式,說(shuō)的簡(jiǎn)單一點(diǎn)就是造對(duì)象不要自己new,而是用工廠的方式做一定程度的解耦,那么這種方式也是造對(duì)象的一種方式

如果我們的對(duì)象是用這樣一種方式造出來(lái)的,交給Spring管理該怎么管呢?

這就是我們要學(xué)習(xí)的第二種方式:用靜態(tài)工廠來(lái)造對(duì)象,接下來(lái)我們來(lái)學(xué)習(xí)以下該怎么做????

對(duì)于它的接口實(shí)現(xiàn)類和靜態(tài)工廠來(lái)說(shuō),這三個(gè)東西是一套東西

如果我們現(xiàn)在要管理這個(gè)bean,首先要寫(xiě)它的配置文件????,那么問(wèn)題來(lái)了,這樣造出來(lái)的對(duì)象究竟是dao的對(duì)象還是factory的對(duì)象?應(yīng)該是factory的

因?yàn)槟闩涫裁丛斐鰜?lái)的就是什么,那我們要的是factory的對(duì)象嗎?

顯然不是,我們要的是factory里邊的方法造出來(lái)的dao對(duì)象,所以我們下面這么寫(xiě)肯定是不行的,我們除了要告訴它的工廠類,還要告訴它一個(gè)東西factory-method屬性來(lái)告訴它工廠是使用哪一個(gè)方法來(lái)造對(duì)象的,到這就可以造出來(lái)了,我們來(lái)運(yùn)行一下,當(dāng)然是用Spring的方式來(lái)運(yùn)行的????。

到這我們的第二種方式就學(xué)完了,但是還有一個(gè)問(wèn)題,為什么不直接new啊,我們要知道工廠中做的有事情,可能會(huì)有一些配置????,并且不能扔,所以強(qiáng)制你必須要用這個(gè)工廠,我們?cè)賮?lái)運(yùn)行一下????

bean的實(shí)例化-實(shí)例工廠與FactoryBean

接下來(lái)我們來(lái)學(xué)習(xí)第三種方式,首先我們來(lái)看看程序環(huán)境????。

注意:此時(shí)這個(gè)工廠是非靜態(tài)的。

在了解完程序環(huán)境后,我們就開(kāi)始學(xué)習(xí)它

首先也是一樣打開(kāi)配置文件,我們?cè)趯?shí)例化的時(shí)候,必須先去造一個(gè)實(shí)例工廠類的對(duì)象,所以我們先來(lái)配置實(shí)例工廠類的bean????

我們?cè)谠斐鲞@個(gè)工廠類的對(duì)象以后,我們?cè)賮?lái)配置dao層的bean????,屬性factory-bean指的是這個(gè)工廠的實(shí)例在哪呢,第二個(gè)是這個(gè)工廠用哪個(gè)方法來(lái)造這個(gè)對(duì)象的????。

我們來(lái)用Spring的方式來(lái)運(yùn)行一下????

上邊我們?yōu)榱嗽靌ao層的對(duì)象,專門(mén)寫(xiě)了一個(gè)factory的bean,其實(shí)這個(gè)東西挺多余的,除了這個(gè)作用以外,無(wú)任何意義,還有在dao層的bean里邊有一個(gè)屬性factory-method,方法名不固定,每個(gè)里邊都得指定,那么這種東西不能寫(xiě)一個(gè)通用的名稱嗎?

針對(duì)以上問(wèn)題,Spring就做了一次改良:FactoryBean,我們先來(lái)看看程序環(huán)境????

  • 注意:工廠造什么對(duì)象,就寫(xiě)什么泛型,第二個(gè)方法返回的是對(duì)象的字節(jié)碼文件.

我們可能會(huì)發(fā)現(xiàn),它和上邊的好像沒(méi)什么區(qū)別,但是它在配置的時(shí)候可簡(jiǎn)單多了,我們接下來(lái)在配置文件中配bean,并且看看是否可以正常運(yùn)行????

結(jié)果是可以正常運(yùn)行,這就是我們所說(shuō)的第三種方式的改良了,在這里我們覆蓋了一個(gè)方法isSingleton

那接下來(lái)我們來(lái)看看,既然你造出來(lái)這個(gè)對(duì)象了,我們可以想一想,造出來(lái)的這個(gè)對(duì)象是單例的還是非單例,我們來(lái)通過(guò)getBean()方法獲得兩個(gè)userDao對(duì)象,并且分別打印,接下來(lái)我們來(lái)看一下 ????

我們通過(guò)結(jié)果可以看出,通過(guò)這種方式造出來(lái)的對(duì)象是單例的,那么怎么樣去改非單例的呢,我們?cè)赨serDaoFactoryBean中加上isSingleton方法,然后返回值設(shè)置為false,就可以改成非單例的了????

我們?cè)賮?lái)運(yùn)行一下,此時(shí)就變成非單例的了

總結(jié)

在本篇文章中,我們先來(lái)介紹了bean的基礎(chǔ)配置,然后詳細(xì)介紹了幾種實(shí)例化bean的方式.

到此這篇關(guān)于Spring之詳解bean的實(shí)例化的文章就介紹到這了,更多相關(guān)Spring之bean的實(shí)例化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • nacos配置注冊(cè)中心時(shí)指定命名空間不起作用的問(wèn)題

    nacos配置注冊(cè)中心時(shí)指定命名空間不起作用的問(wèn)題

    這篇文章主要介紹了nacos配置注冊(cè)中心時(shí)指定命名空間不起作用的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • Java基礎(chǔ)篇之分布式版本控制工具Git

    Java基礎(chǔ)篇之分布式版本控制工具Git

    Git是一個(gè)開(kāi)源的分布式版本控制系統(tǒng),可以有效、高速地處理從很小到非常大的項(xiàng)目版本管理。 也是Linus Torvalds為了幫助管理Linux內(nèi)核開(kāi)發(fā)而開(kāi)發(fā)的一個(gè)開(kāi)放源碼的版本控制軟件
    2021-10-10
  • Log4j不同模塊輸出到不同的文件中

    Log4j不同模塊輸出到不同的文件中

    這篇文章主要介紹了Log4j不同模塊輸出到不同的文件中 的相關(guān)資料,需要的朋友可以參考下
    2016-08-08
  • java實(shí)現(xiàn)Z字形掃描程序

    java實(shí)現(xiàn)Z字形掃描程序

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)Z字形掃描程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • JavaWeb之Filter與Listener使用解析

    JavaWeb之Filter與Listener使用解析

    這篇文章主要介紹了JavaWeb之Filter與Listener使用解析,Filter表示過(guò)濾器,是JavaWeb三大組件(Servlet、Filter、Listener)之一,過(guò)濾器可以把對(duì)資源的請(qǐng)求攔截下來(lái),從而實(shí)現(xiàn)一些特殊的功能,需要的朋友可以參考下
    2024-01-01
  • 深入理解Java設(shè)計(jì)模式之職責(zé)鏈模式

    深入理解Java設(shè)計(jì)模式之職責(zé)鏈模式

    這篇文章主要介紹了JAVA設(shè)計(jì)模式之職責(zé)鏈模式的的相關(guān)資料,文中示例代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解
    2021-11-11
  • java實(shí)現(xiàn)策略模式使用示例

    java實(shí)現(xiàn)策略模式使用示例

    在使用圖像處理軟件處理圖片后,需要選擇一種格式進(jìn)行保存。然而各種格式在底層實(shí)現(xiàn)的算法并不相同,這剛好適合策略模式。編寫(xiě)程序,演示如何使用策略模式與簡(jiǎn)單工廠模式組合進(jìn)行開(kāi)發(fā)
    2014-02-02
  • 最簡(jiǎn)單的spring boot打包docker鏡像的實(shí)現(xiàn)

    最簡(jiǎn)單的spring boot打包docker鏡像的實(shí)現(xiàn)

    這篇文章主要介紹了最簡(jiǎn)單的spring boot打包docker鏡像的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • java servlet手機(jī)app訪問(wèn)接口(一)數(shù)據(jù)加密傳輸驗(yàn)證

    java servlet手機(jī)app訪問(wèn)接口(一)數(shù)據(jù)加密傳輸驗(yàn)證

    這篇文章主要為大家詳細(xì)介紹了java servlet手機(jī)app訪問(wèn)接口(一),數(shù)據(jù)加密傳輸驗(yàn)證,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Java設(shè)計(jì)模式七大原則之合成復(fù)用原則詳解

    Java設(shè)計(jì)模式七大原則之合成復(fù)用原則詳解

    合成復(fù)用原則(Composite Reuse Principle),即盡量使用組合/聚合的方式,而不是使用繼承。本文將為大家具體介紹一下Java設(shè)計(jì)模式七大原則之一的合成復(fù)用原則,需要的可以參考一下
    2022-02-02

最新評(píng)論