在spring配置檔案中使用bean標籤,配以id和class屬性後,且沒有其他屬性和標籤時。採用的就是預設構造建立bean物件,此時如果類中沒有預設建構函式,則物件無法建立
就像這樣
如果我們的要建立的bean物件的預設建構函式沒有的時候,
我們在使用這種方式建立bean物件的話就會出現無法被例項化的錯誤,這就是由於沒有預設構造導致的
假設我們在使用jar包的時候,它裡面有乙個工廠類,工廠類中包含能建立我們需要的物件的方法,例如
假設這就是哪個工廠類,getaccountservice就是能獲得我們想要的物件的方法,那我們如何使用配置檔案來進行配置,才能獲得我們的bean物件呢?
假設如下時含有建立物件的靜態方法的工廠類
那麼如果我們想要建立bean物件的話,配置檔案中應該這樣配置:
我們可以看到,通過核心容器中獲取到的物件,都是單例的
,那如果我們想使用多例的物件的時候,該怎麼辦呢?
bean標籤中有個scope屬性,該屬性用於指定bean的作用範圍,他的取值分別為singleton、prototype、request、session、global-session
singleton:表示的就是單例的(不寫預設就是這個)
prototype:表示多例的
request:表示作用於web應用的請求範圍
session:表示作用於web應用的會話範圍
global-session:表示作用域集群環境的會話範圍(也叫做全域性會話範圍),當不是集群環境時它就是session
當我們的scope屬性設定為prototype時
我們再次執行發現的到的就是兩個物件了
首先我們需要區分是單例物件還是多例物件,因為他們兩個的宣告週期並不相同
舉例示範
我們要建立的物件的類如下
為了演示效果,我們在執行初始化語句的時候控制台列印輸出「物件初始化成功」,在物件被銷毀的時候執行銷毀方法然後控制台列印輸出「物件銷毀成功!」,配置檔案中的bean物件配置如下
測試方法如下
得到的結果就是這樣的
我們可以清晰的看到,當建立容器的時候,物件就會被初始化,當容器關閉的時候物件也銷毀
但是當我們把scope屬性設定為多例物件的話
再次執行相同的測試方法
我們發現,在容器關閉後,並沒有銷毀物件
,那是因為生命週期不同,多例物件的生命週期如下
Spring容器對Bean的管理
spring容器對bean的管理 1 bean物件建立的時機 預設是隨著容器建立,可以使用lazy init true 在呼叫getbean建立 延遲建立 也可以用批量延遲建立 2 bean物件的建立模式 預設是單例,可以使用scope屬性改變。singleton 單例,每次呼叫getbean返回同...
spring對bean的管理細節
1.建立bean的建立方式 1 使用預設建構函式構造 在配置檔案中使用bean標籤,配以id和class屬性,且沒有其他屬性和標籤時,採用的就是預設建構函式建立bean物件,如果此類中沒有預設建構函式,則建立失敗.2 使用普通工廠中的方法建立物件 使用某個類中的方法建立物件,並存入ioc容器中 先配...
Spring對Bean裝配過程
color red spring裝配bean的過程 color 1.例項化 2.設定屬性值 3.如果實現了beannameaware介面,呼叫setbeanname設定bean的id或者name 4.如果實現beanfactoryaware介面,呼叫setbeanfactory 設定beanfact...