本篇介紹Spring Bean實(shí)例的作用范圍瞻颂,Spring Bean實(shí)例的作用范圍由配置項(xiàng)scope限定梅尤。通過本篇的學(xué)習(xí)埂淮,可以達(dá)成如下目標(biāo)慨畸。
● 應(yīng)用scope配置項(xiàng)配置Bean的作用域
● 應(yīng)用單例模式singleton
● 應(yīng)用原型模式prototype
1、作用域scope配置項(xiàng)
作用域限定了Spring Bean的作用范圍蛛蒙,在Spring配置文件定義Bean時(shí)糙箍,通過聲明scope配置項(xiàng),可以靈活定義Bean的作用范圍牵祟。例如倍靡,當(dāng)你希望每次IOC容器返回的Bean是同一個(gè)實(shí)例時(shí),可以設(shè)置scope為singleton课舍;當(dāng)你希望每次IOC容器返回的Bean實(shí)例是一個(gè)新的實(shí)例時(shí)塌西,可以設(shè)置scope為prototype。
scope配置項(xiàng)有5個(gè)屬性筝尾,用于描述不同的作用域捡需。
① singleton
使用該屬性定義Bean時(shí),IOC容器僅創(chuàng)建一個(gè)Bean實(shí)例筹淫,IOC容器每次返回的是同一個(gè)Bean實(shí)例站辉。
② prototype
使用該屬性定義Bean時(shí),IOC容器可以創(chuàng)建多個(gè)Bean實(shí)例损姜,每次返回的都是一個(gè)新的實(shí)例饰剥。
③ request
該屬性僅對(duì)HTTP請(qǐng)求產(chǎn)生作用,使用該屬性定義Bean時(shí)摧阅,每次HTTP請(qǐng)求都會(huì)創(chuàng)建一個(gè)新的Bean汰蓉,適用于WebApplicationContext環(huán)境。
④ session
該屬性僅用于HTTP Session棒卷,同一個(gè)Session共享一個(gè)Bean實(shí)例顾孽。不同Session使用不同的實(shí)例。
⑤ global-session
該屬性僅用于HTTP Session比规,同session作用域不同的是若厚,所有的Session共享一個(gè)Bean實(shí)例。
下面重點(diǎn)討論singleton蜒什、prototyp作用域测秸,request、session和global-session類作用域放到Spring MVC章節(jié)討論灾常,這里不再做詳細(xì)講述霎冯。
2、singleton作用域
singleton是默認(rèn)的作用域岗憋,當(dāng)定義Bean時(shí)肃晚,如果沒有指定scope配置項(xiàng),Bean的作用域被默認(rèn)為singleton仔戈。singleton屬于單例模式关串,在整個(gè)系統(tǒng)上下文環(huán)境中,僅有一個(gè)Bean實(shí)例监徘。也就是說晋修,在整個(gè)系統(tǒng)上下文環(huán)境中,你通過Spring IOC獲取的都是同一個(gè)實(shí)例凰盔。
配置Bean為singleton作用域的配置代碼如下墓卦。
singleton作用域示例:
(1)課程案例新建SingletonTest類文件,添加下面的代碼户敬。
(2)修改IocPrincipal類文件落剪,添加輸出EmailNotice和PhoneNotice實(shí)例的hashCode睁本,用于判斷程序兩次從IOC容器中獲取的實(shí)例是否為同一實(shí)例。
(3)執(zhí)行SingletonTest類文件忠怖,輸出結(jié)果如下圖所示呢堰。
圖1 執(zhí)行SingletonTest類輸出結(jié)果
從輸出結(jié)果可以看出,程序兩次從IOC容器中獲取的EmailNotice和PhoneNotice實(shí)例的hashCode是相同的凡泣,說明IOC容器返回的是同一個(gè)實(shí)例枉疼。
3、prototype作用域
當(dāng)一個(gè)Bean的作用域被定義prototype時(shí)鞋拟,意味著程序每次從IOC容器獲取的Bean都是一個(gè)新的實(shí)例骂维。因此,對(duì)有狀態(tài)的bean應(yīng)該使用prototype作用域贺纲,而對(duì)無狀態(tài)的bean則應(yīng)該使用singleton作用域航闺。
配置Bean為singleton作用域的配置代碼如下。
prototype作用域示例:
(1)修改dispatcher.xml配置文件哮笆,在定義的Bean中添加prototype屬性来颤。
(3)執(zhí)行SingletonTest類文件,輸出結(jié)果如下圖所示稠肘。
圖2 添加prototype后執(zhí)行SingletonTest
從輸出結(jié)果可以看出福铅,程序兩次從IOC容器中獲取的EmailNotice和PhoneNotice實(shí)例的hashCode是不相同的,說明EmailNotice和PhoneNotice添加prototype作用域后项阴,IOC容器每次返回的都是一個(gè)新的實(shí)例滑黔。
課程小結(jié)
Spring IOC容器創(chuàng)建一個(gè)Bean實(shí)例時(shí),可以為Bean指定實(shí)例的作用域环揽,作用域包括singleton(單例模式)略荡、prototype(原型模式)、request(HTTP請(qǐng)求)歉胶、session(會(huì)話)汛兜、global-session(全局會(huì)話)。
本文重點(diǎn)介紹了singleton和prototype模式通今,這兩個(gè)模式的作用域在Spring框架中是經(jīng)常用到的粥谬。對(duì)于singleton作用域的Bean,IOC容器每次都返回同一個(gè)實(shí)例辫塌,而prototype作用域的Bean漏策,IOC容器每次產(chǎn)生一個(gè)新的實(shí)例。