日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring容器中Bean的作用域

發(fā)布時間:2025/3/21 javascript 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring容器中Bean的作用域 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

當通過Spring容器創(chuàng)建一個Bean實例時,不僅可以完成Bean實例的實例化,還可以為Bean指定特定的作用域。Spring支持如下5種作用域:

  • singleton:單例模式,在整個Spring IoC容器中,使用singleton定義的Bean將只有一個實例
  • prototype:原型模式,每次通過容器的getBean方法獲取prototype定義的Bean時,都將產(chǎn)生一個新的Bean實例
  • request:對于每次HTTP請求,使用request定義的Bean都將產(chǎn)生一個新實例,即每次HTTP請求將會產(chǎn)生不同的Bean實例。只有在Web應用中使用Spring時,該作用域才有效
  • session:對于每次HTTP Session,使用session定義的Bean豆?jié){產(chǎn)生一個新實例。同樣只有在Web應用中使用Spring時,該作用域才有效
  • globalsession:每個全局的HTTP Session,使用session定義的Bean都將產(chǎn)生一個新實例。典型情況下,僅在使用portlet context的時候有效。同樣只有在Web應用中使用Spring時,該作用域才有效

其中比較常用的是singleton和prototype兩種作用域。對于singleton作用域的Bean,每次請求該Bean都將獲得相同的實例。容器負責跟蹤Bean實例的狀態(tài),負責維護Bean實例的生命周期行為;如果一個Bean被設置成prototype作用域,程序每次請求該id的Bean,Spring都會新建一個Bean實例,然后返回給程序。在這種情況下,Spring容器僅僅使用new 關鍵字創(chuàng)建Bean實例,一旦創(chuàng)建成功,容器不在跟蹤實例,也不會維護Bean實例的狀態(tài)。

如果不指定Bean的作用域,Spring默認使用singleton作用域。Java在創(chuàng)建Java實例時,需要進行內(nèi)存申請;銷毀實例時,需要完成垃圾回收,這些工作都會導致系統(tǒng)開銷的增加。因此,prototype作用域Bean的創(chuàng)建、銷毀代價比較大。而singleton作用域的Bean實例一旦創(chuàng)建成功,可以重復使用。因此,除非必要,否則盡量避免將Bean被設置成prototype作用域。

設置Bean的基本行為,通過scope屬性指定,該屬性可以接受singleton、prototype、request、session、globlesession5個值,分別代表以上5種作用域。下面的配置片段中,singleton和prototype各有一個:

1 2 3 4 <!-- 默認的作用域:singleton --> <bean id="p1"class="com.abc.Person"/> <!-- 指定的作用域:prototype --> <bean id="p2"class="com.abc.Person"scope="prototype"/>

下面是一個測試類:

1 2 3 4 5 6 7 8 9 publicclass BeanTest {   publicstatic void main(String args[]) {     //加載類路徑下的beans.xml文件以初始化Spring容器     ApplicationContext context = newClassPathXmlApplicationContext();     //分兩次分別取同一個Bean,比較二者是否是同一個對象     System.out.println(context.getBean("p1") == context.getBean("p1"));     System.out.println(context.getBean("p2") == context.getBean("p2"));   } }

 執(zhí)行結果分別是:true和false

從結果可以看出,正如上文所述:對于singleton作用域的Bean,每次請求該id的Bean,都將返回同一個實例,而prototype作用域的Bean, 每次請求都將產(chǎn)生全新的實例。

注意:早期指定Bean的作用域也可通過singleton屬性指定,該屬性只接受兩個屬性值:true和false,分別代表singleton和prototype的作用域。使用singleton屬性則無法指定其他三個作用域。實際上Spring2.X不推薦使用singleton屬性指定Bean的作用域,singleton屬性是Spring 1.2.X的使用方式。

對于request作用域,查看如下Bean定義:

1 <bean id="loginAction"class="com.abc.LoginAction"scope="request"/>

針對每次HTTP請求,Spring容器會根據(jù)loginActionBean定義創(chuàng)建一個全新的LoginAction實例,且該loginAction實例盡在當前HTTP Request內(nèi)有效。因此,如果程序需要,完全可以自由更改Bean實例的內(nèi)部狀態(tài);其他請求所獲得的loginAction實例無法感覺到這種內(nèi)部狀態(tài)的改變。當處理請求結束時,request作用域的Bean將會被銷毀。

注意:request、session作用域的Bean只對Web應用才真正有效。實際上通常只會將Web應用的控制器Bean才指定成request作用域

session作用域與request作用域完全類似,區(qū)別在于:request作用域的Bean對于每次HTTP請求有效,而session作用域的Bean對于每次Session有效。在Web應用中,為了讓request和session作用域生效,必須將HTTP請求對象綁定到為該請求提供服務的線程上,這使得具有request和session作用域的Bean實例能夠在后面的調(diào)用鏈中被訪問到。

為此我們有兩種配置方式:采用Listener配置或者采用Filter配置。當使用Servlet 2.4及以上規(guī)范的Web容器時,我們可以在Web應用的web.xml文件中增加Listener配置,該Listener負責為request作用域生效:

1 2 3 4 5 <listener>  ? <listener-class>  ????? org.springframework.web.context.request.RequestContextListener  ? </listener-class> </listener>

如果使用了只支持Servlet 2.4以前規(guī)范的Web容器,則該容器不支持Listener規(guī)范,故無法使用這種配置方式,只能改為使用Filter配置方式,配置片段如下

1 2 3 4 5 6 7 8 9 10 <filter>    <filter-name>requestContextFilter</filter-name>    <filter-class>    ?? org.springframework.web.filter.RequestContextFilter    </filter-class> </filter> <filter-mapping>   <filter-name>requestContextFilter</filter-name>   <url-pattern>/*</url-pattern> </filter-mapping>

一旦在web.xml中增加了如上任意一種配置,程序就可以在Spring配置文件中使用request或者session作用域了。下面是Spring配置文件的片段:

1 <bean id="p3"class="com.abc.Person"scope="request"/>

這樣,Spring容器會每次HTTP請求都生成一個Person實例,當該請求響應結束時,該實例也隨之消失。

如果Web應用直接使用Spring MVC作為MVC框架,即使用SpringDispatcherServlet或DispatcherPortlet來連接所有用戶請求,則無需這些額外的配置,因為他們已經(jīng)處理了所有和請求有關的狀態(tài)處理。

注意:Spring 3.0 不僅可以為Bean指定已經(jīng)存在的5個作用域,還支持自定義作用域,關于自定義作用域的內(nèi)容,請參看Spring官方文檔等資料。


原文出處:?擺渡者

from:?http://www.importnew.com/20736.html

總結

以上是生活随笔為你收集整理的Spring容器中Bean的作用域的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。