中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring中bean實例化怎么實現

發布時間:2023-01-17 11:25:48 來源:億速云 閱讀:84 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“Spring中bean實例化怎么實現”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Spring中bean實例化怎么實現”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

    bean實例化

    bean的基礎配置

    在學習bean的實例化之前,我們先來學習bean該如何配置。

    在bean的配置這一塊,我們將學習三塊內容,分別為:我們先來看一下bean的基礎配置bean基礎配置、bean別名配置、bean作用范圍配置。

    id用來定義bean的名稱,通過它可以獲取,class用來指定bean的類型,也就是你造出來的bean究竟是哪一個類的

    那么這個時候就有一個問題了,對應的bean的id你寫好了,但是你的命名習慣和我的命名習慣不一樣,我不想叫這個名稱,有沒有辦法呢,這就是有關bean可以起多個名稱,也就是所謂的bean的別名。

    • 接下來我們來看bean的別名配置,在學習之前,我們先來交代一下當前的程序環境

    service層接口

    Spring中bean實例化怎么實現

    service層實現類

    Spring中bean實例化怎么實現

    dao層接口

    Spring中bean實例化怎么實現

    dao層實現類

    Spring中bean實例化怎么實現

    applicationContext.xml配置文件

    Spring中bean實例化怎么實現

    主方法

    Spring中bean實例化怎么實現

    • 在了解了程序環境以后,我們開始來學習別名配置。

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

    Spring中bean實例化怎么實現

    注意:別名可以有多個,使用逗號,分號,或者空格進行分隔。

    當我們在主方法中將getBean()方法里邊的參數改為我們配置的別名,我們會發現程序還可以正常運行,那就說明我們配置的別名是有效的。

    Spring中bean實例化怎么實現

    接下來我們思考:我們在綁定service與dao的關系時,在service層配置的bean里邊有一個屬性ref表示的是參照dao層配置的bean,屬性值為dao層配置的bean的屬性id,那么如果我們將ref這個屬性改為我們在dao層配置的bean的別名,那么程序還可以正常運行嗎?我們來演示一下

    Spring中bean實例化怎么實現

    Spring中bean實例化怎么實現

    通過以上演示,我們可以得知別名的作用范圍是很大的??雖然我們學習了用別名配置bean的方式,但是還是建議我們ref參照的時候,還是引用id屬性。

    • 接下來需要說一說我們需要注意的問題了

    回到我們的主方法中,我們現在在getBean()方法中傳遞進去一個我們沒有的參數service5,這是在配置的service的bean中的id屬性和name屬性都沒有的參數,那我們運行的話會有什么問題呢

    Spring中bean實例化怎么實現

    運行完會報出一個異常,這個異常的意思就是沒有一個這樣的bean被定義,如果以后我們遇到這個異常的話,只需要檢查我們的名字就行了

    Spring中bean實例化怎么實現

    • bean的別名配置我們已經說完了,接下來我們來學習bean的作用范圍

    什么叫bean的作用范圍呢?其實就是你現在創建的bean的究竟是一個對象還是多個對象,什么意思呢,其實就是說你造的對象是單例的還是非單例的,我們先來看看如下代碼

    Spring中bean實例化怎么實現

    我們獲取到BookDao的對象,并且打印它的地址

    Spring中bean實例化怎么實現

    那我們將以上代碼復制兩份并且分別打印它們的地址,會出現什么結果呢

    Spring中bean實例化怎么實現

    Spring中bean實例化怎么實現

    通過運行結果我們可以發現,兩次打印的結果是同一個地址,那么它們也可以認為是同一個對象了

    由此得出:Spring默認給我們創建的bean是單例的,那么這時候就有新問題了,如果我想要創建一個非單例的該怎么辦,這個時候就要通過配置的方法解決這個問題了

    如下,我們在dao層配置的bean后邊再加一個屬性scope,就是作用范圍的意思

    里邊有兩個值,一個singleton表示單例的,一個prototype表示非單例的,不寫的話,默認是signleton,我們設置scope屬性為prototype,來看看運行結果

    Spring中bean實例化怎么實現

    Spring中bean實例化怎么實現

    通過運行結果我們可以得出,此時的所創建的兩個對象是不同的,注意:我們上面所框出的是對象的哈希值,不是對象的地址但是可以當做是對象的地址??

    • 在學完bean的作用范圍,我們可以認為它是可以控制創建的bean是一個或者是多個的,那么新的問題來了,為什么bean默認是單例的?

    我們來解釋一下,對于Spring來說,它幫我們管理的bean要放到它的容器中,我們 假定一個場景,如果它造出來的bean不是非單例的,那么這個bean的數量會有多少呢?

    它會無窮無盡,用一次造一個,所以說Spring它并不是幫我們管理這一類bean的

    這樣的話,對Spring容器來說也有一個非常大的壓力,那Spring幫我們管理的bean都是單例的,那會對我們的業務造成傷害嗎

    你想一想,你造一個dao對象,執行完一個方法,下一次你又需要造一個dao對象,再執行另一個方法,那我這兩個對象用同一個不行嗎?

    好像沒有什么問題,就是這個原因,Spring容器在幫我們管理對象的時候其實就是在管理那些你可以復用的對象,就是這個對象你用一次,下一次還用它,所以你下次還會從容器中拿,這樣它的效率才會更高一些,

    因此,它就簡單一點,給你造的bean就是單例的??。

    • 那么新的問題有又來了,哪些bean適合造單例的呢?

    我們的表現層對象,比如說我們現在寫的Servlet,業務層對象, Service,數據層對象,Dao,或者還有一些工具類的對象,這些對象,你造一次就ok了,就這個對象我可以反復用,這些東西交給Spring管理?。

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

    封裝實體的域對象不適合交給Spring管理,因為它里邊會記錄一些它的成員變量的一些屬性值,到這里我們就知道了bean的作用范圍是控制我們bean創建的實例的數量的。

    bean的實例化-構造方法

    上面我們學習完了bean的基礎配置,那就有人問了,我們的這個單例bean是如何造出來的呢,和我們以前的寫法一樣嗎,也是用new的方式造出來的嗎,我們現在就來學習bean的實例化-構造方法實例化的方式。

    對于bean來說,其本質是對象,在前面我們說過,我們將容器中管理的對象叫做bean,我們以前創造對象是怎么寫:new跟構造方法,對于Spring來說,它也是通過構造方法來完成bean的創建的,一起來看一下

    Spring中bean實例化怎么實現

    Spring中bean實例化怎么實現

    Spring中bean實例化怎么實現

    Spring中bean實例化怎么實現

     以上是我們程序的環境????,接下來我們來說以前我們造對象new+構造方法,對于Spring來說,同樣的道理,它也是用構造方法來造對象的。

     接下來我們在dao的實現類中生成構造方法,并且在構造方法中打印一句話

    Spring中bean實例化怎么實現

    什么都不動,我們再來運行一下,看看這句話執行了沒有,如果執行了,那就意味著Spring容器調用了構造方法造對象

    Spring中bean實例化怎么實現

    結果是用了,造對象都得用構造方法,在這說一個東西,我們將構造方法的權限修飾符改為private,我們說如果以前我們寫程序,把構造方法私有化以后,我們在外邊還可以造對象嗎?顯然是絕對造不出來的

    結果是不是出人意料啊,Spring還可以調用它的構造方法

    那就說明了一點,Spring確實是通過構造方法來造對象的,而且不管是公共的還是私有的它都能調到,我們可以猜到它的內部是怎么回事嗎,私有的東西它居然可以訪問,怎么做的

    是通過反射,后邊我們在學習一些內部工作原理的時候,我們再來學習它,現在只需要知道它是通過構造方法造對象的就可以了

    但是這個時候就有人提出來了一個問題,那萬一給它加一個參數呢?

    Spring中bean實例化怎么實現

    我們來試一試,并且運行一下,會發現它已經不能正常運行了,這就說明了一點,Spring在創建bean的時候,調用的是無參構造方法,到這里我們就學習完了第一種實例化bean的方式,就是用構造方法來實例化對象??

    Spring中bean實例化怎么實現

    bean的實例化-靜態工廠

    • 前面我們學習了用構造方法來實例化bean,接下來我們來說第二種方式,在學習第二種方式之前

    • 我們先來回顧一個東西,我們在前邊講過,用工廠也可以造對象,我們先來看看程序環境

    Spring中bean實例化怎么實現

    Spring中bean實例化怎么實現

    • 接下來我提供了一個工廠類

    Spring中bean實例化怎么實現

    • 如果用這個來寫的話,會是什么樣子的呢?接下來我們來看一下

    先去使用工廠去獲得這個對象,然后去運行,我們去運行一下

    Spring中bean實例化怎么實現

    Spring中bean實例化怎么實現

    我們發現這是可以運行的,其實這是早些年做程序的一個常用的方式,說的簡單一點就是造對象不要自己new,而是用工廠的方式做一定程度的解耦,那么這種方式也是造對象的一種方式

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

    這就是我們要學習的第二種方式:用靜態工廠來造對象,接下來我們來學習以下該怎么做

    對于它的接口實現類和靜態工廠來說,這三個東西是一套東西

    如果我們現在要管理這個bean,首先要寫它的配置文件,那么問題來了,這樣造出來的對象究竟是dao的對象還是factory的對象?應該是factory的

    因為你配什么造出來的就是什么,那我們要的是factory的對象嗎?

    顯然不是,我們要的是factory里邊的方法造出來的dao對象,所以我們下面這么寫肯定是不行的,我們除了要告訴它的工廠類,還要告訴它一個東西factory-method屬性來告訴它工廠是使用哪一個方法來造對象的,到這就可以造出來了,我們來運行一下,當然是用Spring的方式來運行的。

    Spring中bean實例化怎么實現

    Spring中bean實例化怎么實現

    Spring中bean實例化怎么實現

    Spring中bean實例化怎么實現

    到這我們的第二種方式就學完了,但是還有一個問題,為什么不直接new啊,我們要知道工廠中做的有事情,可能會有一些配置,并且不能扔,所以強制你必須要用這個工廠,我們再來運行一下。

    Spring中bean實例化怎么實現

    bean的實例化-實例工廠與FactoryBean

    接下來我們來學習第三種方式,首先我們來看看程序環境。

    Spring中bean實例化怎么實現

    Spring中bean實例化怎么實現

    Spring中bean實例化怎么實現

    注意:此時這個工廠是非靜態的。

    Spring中bean實例化怎么實現

    Spring中bean實例化怎么實現

    在了解完程序環境后,我們就開始學習它

    首先也是一樣打開配置文件,我們在實例化的時候,必須先去造一個實例工廠類的對象,所以我們先來配置實例工廠類的bean。

    Spring中bean實例化怎么實現

    我們在造出這個工廠類的對象以后,我們再來配置dao層的bean,屬性factory-bean指的是這個工廠的實例在哪呢,第二個是這個工廠用哪個方法來造這個對象的。

    Spring中bean實例化怎么實現

    我們來用Spring的方式來運行一下

    Spring中bean實例化怎么實現

    Spring中bean實例化怎么實現

    上邊我們為了造dao層的對象,專門寫了一個factory的bean,其實這個東西挺多余的,除了這個作用以外,無任何意義,還有在dao層的bean里邊有一個屬性factory-method,方法名不固定,每個里邊都得指定,那么這種東西不能寫一個通用的名稱嗎?

    針對以上問題,Spring就做了一次改良:FactoryBean,我們先來看看程序環境

    Spring中bean實例化怎么實現

    • 注意:工廠造什么對象,就寫什么泛型,第二個方法返回的是對象的字節碼文件.

    我們可能會發現,它和上邊的好像沒什么區別,但是它在配置的時候可簡單多了,我們接下來在配置文件中配bean,并且看看是否可以正常運行

    Spring中bean實例化怎么實現

    結果是可以正常運行,這就是我們所說的第三種方式的改良了,在這里我們覆蓋了一個方法isSingleton

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

    Spring中bean實例化怎么實現

    Spring中bean實例化怎么實現

    Spring中bean實例化怎么實現

    我們通過結果可以看出,通過這種方式造出來的對象是單例的,那么怎么樣去改非單例的呢,我們在UserDaoFactoryBean中加上isSingleton方法,然后返回值設置為false,就可以改成非單例的了

    Spring中bean實例化怎么實現

    我們再來運行一下,此時就變成非單例的了

    Spring中bean實例化怎么實現

    讀到這里,這篇“Spring中bean實例化怎么實現”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    喀喇沁旗| 康乐县| 博野县| 广安市| 新龙县| 正阳县| 淮滨县| 乌兰浩特市| 柳江县| 姜堰市| 尉犁县| 当阳市| 尼木县| 泰顺县| 常宁市| 宜君县| 河西区| 安福县| 邵东县| 云浮市| 小金县| 河池市| 阜新| 吴忠市| 图片| 鄯善县| 内江市| 舞阳县| 霍林郭勒市| 新津县| 句容市| 普陀区| 伊吾县| 泰顺县| 吉木乃县| 海南省| 锡林浩特市| 河曲县| 贵德县| 博爱县| 涿州市|