posts - 495,  comments - 11,  trackbacks - 0

          作用域?qū)?duì)Bean的生命周期和創(chuàng)建方式產(chǎn)生影響.

          singleton??????????? 在spring IOC容器中僅存在一個(gè)Bean實(shí)例,Bean以單實(shí)例的方式存在.


          prototype??????????? 每次從容器中調(diào)用Bean時(shí),都返回一個(gè)新的實(shí)例,即每次調(diào)用getBean()時(shí),相當(dāng)于執(zhí)行new XxxBean()的操作.


          request?????????????? 每次HTTP請(qǐng)求都會(huì)創(chuàng)建一個(gè)新的Bean,該作用域僅適用于webApplicationContext環(huán)境.


          session?????????????? 同一個(gè)HTTP session共享一個(gè)Bean,不同HTTP session使用不同的Bean,該作用域僅適用于webApplicationContext環(huán)境.


          globalSession?? 同一個(gè)全局session共享一個(gè)Bean,一般用于portlet應(yīng)用環(huán)境,該作用域僅適用于webApplicationContext環(huán)境.

          在低版本的spring中,由于只有兩個(gè)Bean作用域,所以采用singleton="true|false"的配置方式,spring2.0為了向后兼容,依舊支持這種配置方式.不過(guò),spring2.0推薦采用新的配置方式:scope="<作用域類型>"

          -------------------------------------------------

          singleton作用域


          spring以容器的方式提供天然的單實(shí)例模式功能,任何POJO無(wú)須編寫特殊的代碼僅通過(guò)配置就可以了.

          注意:spring將Bean的默認(rèn)作用域定為singleton.

          singleton例:

          <bean id="car" class="com.baobaotao.scope.Car" scope="singleton"/>

          <bean id="boss1" class="com.baobaotao.scope.Boss">

          <property name="car" ref="car"/>

          </bean>

          Car Bean聲明為singleton(因?yàn)槟J(rèn)是singleton,所以可以不顯式指定).

          在默認(rèn)情況下,spring的ApplicationContext容器在啟動(dòng)時(shí),自動(dòng)實(shí)例化所有singleton的Bean并緩存于容器中.

          雖然啟動(dòng)時(shí)會(huì)花費(fèi)一些時(shí)間,但帶來(lái)兩個(gè)好處:首先對(duì)Bean提前的實(shí)例化操作會(huì)及早發(fā)現(xiàn)一些潛在的配置問(wèn)題.

          其次Bean以緩存的方式保存,當(dāng)運(yùn)行時(shí)使用到該Bean時(shí)就無(wú)須再實(shí)例化了,加快了運(yùn)行效率.如果用戶不希望在容

          器啟動(dòng)時(shí)提前實(shí)例化singleton的Bean,可以通過(guò)lazy-init屬性進(jìn)行控制:

          <bean id="boos1" class="com.baobaotao.scope.Boss" lazy-init="true">

          <property name="car" ref="car"/>

          </bean>

          lazy-init="true"的Bean在某些情況下依舊會(huì)提前實(shí)例化:如果該Bean被其它需要提前實(shí)例化的Bean引用到,

          spring也將忽略延遲實(shí)例化的設(shè)置.

          -------------------------------------------------

          prototype作用域

          采用scope="prototype"指定非單實(shí)例作用域Bean,請(qǐng)看:

          <bean id="car" class="com.baobaotao.scope.Car" scope="prototype"/>

          <bean id="boss1" class="com.baobaotao.scope.Boss">

          <property name="car" ref="car"/>

          </bean>

          <bean id="boss2" class="com.baobaotao.scope.Boss">

          <property name="car" ref="car"/>

          </bean>

          boss1,boss2所引用的都是一個(gè)獨(dú)立的Car實(shí)例.

          在默認(rèn)情況下,spring容器在啟動(dòng)時(shí)不實(shí)例化prototype的Bean.此外,spring容器將prototype的Bean交給調(diào)用

          者后,就不再管理它的生命周期.

          -------------------------------------------------

          web應(yīng)用環(huán)境相關(guān)的Bean作用域

          如果用戶使用spring的webApplicationContext,則可以使用另外3種Bean的作用域:request,session和globalSession.不過(guò)

          在使用這些作用域之前,首先必須在web容器中進(jìn)行一些額外的配置,在高版本的web容器中,則可以利用HTTP請(qǐng)求監(jiān)聽器進(jìn)行配置:

          <web-app>

          ...

          <listener>

          <listener-class>

          org.springframework.web.context.request.RequestContextListener

          </listener-class>

          </listener>

          ...

          </web-app>

          細(xì)心的朋友可能有一個(gè)疑問(wèn):在介紹webApplicationContext初始化時(shí),我們已經(jīng)通過(guò)ContextLoaderListener將web容器與

          spring容器整合,為什么這里又要引入一個(gè)額外的RequestContextListener以支持Bean的另外3個(gè)作用域呢?

          在整合spring容器時(shí)使用ContextLoaderListener,它實(shí)現(xiàn)了ServletContextListener監(jiān)聽器接口,ServletContextListener

          只負(fù)責(zé)監(jiān)聽web容器啟動(dòng)和關(guān)閉的事件.而RequestContextListener實(shí)現(xiàn)ServletRequestListener監(jiān)聽器接口,該監(jiān)聽器監(jiān)聽

          HTTP請(qǐng)求事件,web服務(wù)器接收的每一次請(qǐng)求都會(huì)通知該監(jiān)聽器.

          spring容器啟動(dòng)和關(guān)閉操作由web容器的啟動(dòng)和關(guān)閉事件觸發(fā),但如果spring容器中的Bean需要request,session,globalsession

          作用域的支持,spring容器本身就必須獲得web容器的HTTP請(qǐng)求事件,以HTTP請(qǐng)求的事件"驅(qū)動(dòng)"Bean作用域的控制邏輯.

          request作用域

          顧名思義,request作用域的Bean對(duì)應(yīng)一個(gè)HTTP請(qǐng)求和生命周期,考慮下面的配置:

          <bean name="car" class="com.baobaotao.scope.Car" scope="request"/>

          這樣,每次HTTP請(qǐng)求調(diào)用到car Bean時(shí),spring容器創(chuàng)建一個(gè)新的Car Bean,請(qǐng)求處理完畢后,銷毀這個(gè)Bean.

          session作用域

          假設(shè)將以上car的作用域調(diào)整為session類型:

          <bean name="car" class="com.baobaotao.scope.Car" scope="session"/>

          這樣配置后,car Bean的作用域橫跨整個(gè)HTTP session,session中所有HTTP請(qǐng)求都共享同一個(gè)Car Bean,當(dāng)HTTP Session結(jié)束后,實(shí)例

          才被銷毀.

          globalSession作用域

          下面的配置片斷將car的作用域設(shè)置為了globalSession:

          <bean name="loginController" class="com.baobaotao.scope.Car" scope="globalSession"/>

          globalSession作用域類似于session作用域,不過(guò)僅在portlet的web應(yīng)用中使用.Portlet規(guī)范定義了全局Session概念,它被組成portlet

          web應(yīng)用的所有子portlet共享.如果不在Portlet web應(yīng)用環(huán)境下,globalSession自然等價(jià)于session作有域了.

          posted on 2009-08-31 14:48 jadmin 閱讀(145) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 嘉兴市| 平顶山市| 合水县| 凤冈县| 宜章县| 建宁县| 陆川县| 镶黄旗| 建始县| 铜山县| 唐河县| 清水河县| 克什克腾旗| 岐山县| 壤塘县| 阳新县| 巴中市| 通许县| 红原县| 长葛市| 金华市| 奎屯市| 弥勒县| 武汉市| 宣恩县| 陈巴尔虎旗| 元朗区| 金阳县| 屯留县| 资兴市| 太谷县| 确山县| 永昌县| 呼伦贝尔市| 灵山县| 抚远县| 武义县| 东台市| 湖州市| 抚顺市| 乐亭县|