Spring系列教程四:Spring對Bean的管理細節

1、Spring建立bean的三種方式

①使用默認構造函數建立web

在spring配置文件中使用bean標籤,配以id和class屬性後,且沒有其餘屬性和標籤時。採用的就是默認構造函數建立bean對象,此時若是類中沒有默認構造函數,則對象沒法建立,示例子以下spring

在accountServiceImpl結構中原本是有一個默認構造函數,如今咱們在默認構造函數裏面傳了幾個參數進去,再也不從新建立默認構造函數,如今咱們來點擊運行一下,結果以下,顯示建立實例對象失敗,沒有找到默認構造函數,與此同時咱們的配置文件也在報錯服務器

②使用普通工廠中的方法建立對象(使用某個類中的方法建立對象,而且存入spring容器)session

首先咱們先建立一個工廠類,經過工廠類最終來獲得一個AccountService對象負載均衡

那麼咱們bean配置文件中修改的代碼以下,根據上面註釋掉的代碼得知,咱們是要經過惟一的id標示符得到一個新的對象,可是這樣寫的話,這樣建立出來的是咱們的須要的那個accountServie對象嘛,實際上咱們獲得的是一個工廠對象,咱們要的是工廠對象裏面return出來的那個對象函數

正確的寫法是上面的第二張圖,咱們是要經過工廠對象建立accountService對象,那好,第一行是建立是工廠對象,咱們是須要用它裏面的方法建立咱們須要的accountSerivce對象,那麼地二行咱們就須要定義一個accountService對象,那麼這個對象是怎麼來的啦?是factory-bean這個id,裏面指定的factory-method這個方法return出來的網站

③使用普通工廠中的靜態方法建立對象(使用某個類中的靜態方法建立對象,而且存入spring容器)spa

先建立一個靜態的工廠類的方法prototype

在配置文件中作出的改動,這樣寫的話就是咱們須要建立出來的那個對象嘛??只是建立的一個Staticfactory對象,那怎麼才能取到咱們須要的accountService對象啦??這個時候就須要在後面加factory-method,直接調用靜態方法,執行結果如第三張圖對象

2、bean對象的做用範圍

在工廠模式中解耦的時候,咱們都知道bean是個單例對象,那麼咱們強大的Spring對象是否是也知道bean是個單例對象啦??下面咱們在容器中取兩個對象,那麼這個兩個對象是否是同iyge對象啦!!

構造函數只運行了一次,spirng 中的bean對象默認單例對象,那麼怎麼去調整這個bean對象做用範圍?那就不得不用scope屬性

scope屬性主要包括

singleton(單例,默認值)

prototype(多例)

request(做用於web應用的請求範圍)

session(做用於web應用的會話範圍)

golbal-session(做用於集羣環境會話範圍,也稱爲全局範圍,當不是集羣環境時候就是session)

 

當咱們把做用範圍改爲prototype的時候,這個時候對象被建立了兩次不是同一個對象

有一個疑問?什麼是golbal-session??好的各位大佬,下面給你們解釋一下

咱們在訪問網站服務器的時候,要是訪問的人數比較多的話,一臺是不夠的,並且這個時候就經過負載均衡來決定你的訪問是用那一臺空閒的服務器

這個時候你確定是要登錄的,那麼你的我的密碼等信息若是是保持的第一臺服務器session上的,那麼下一次你在訪問的時候,負載均衡會隨機給你再分配一臺空閒的服務器

那麼這個時候必然會存在驗證,實際狀況中這種狀況都是咱們不但願碰見的,這個時候golbal session就起做用了,它把全部的session做爲一個總體的session

3、bean對象的生命週期

bean分爲兩種對象,一個是單例對象,一個是多例對象

如今咱們先試一下單例對象

手動關閉以下,可是這個又是怎麼回事?

顯示結果以下,可是沒有顯示容器被習銷燬了,這是怎麼回事??main方法是一切程序的入口,還沒來的及調用這個方法,都已經結束啦,這個時候須要咱們手動關閉

主要是你用的是父藉口去調用了子類特有的方法,固然是不能實現的,要換成子類,圖下顯示對象被銷燬

相關文章
相關標籤/搜索