Spring支持如下5種作用域

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

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

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

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

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

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

下面是一個測試類:

public class BeanTest {public static void main(String args[]) {//加載類路徑下的beans.xml文件以初始化Spring容器ApplicationContext context = new ClassPathXmlApplicationContext();//分兩次分別取同一個Bean,比較二者是否是同一個對象System.out.println(context.getBean("p1") == context.getBean("p1"));System.out.println(context.getBean("p2") == context.getBean("p2"));}
}

 執行結果分別是:true和false

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

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

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

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

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

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

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

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

<listener><listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

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

<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配置文件的片段:

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

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

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

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387457.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387457.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387457.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RBAC授權

給用戶授予RBAC權限沒有權限會報如下錯誤&#xff1a;執行查看資源報錯&#xff1a; unable to upgrade connection: Forbidden (userkubernetes, verbcreate, resourcenodes, subresourceproxy)[roottest4 ~]# kubectl exec -it http-test-dm2-6dbd76c7dd-cv9qf sh error: una…

出卷子

http://chujuanzi.com/ 出卷子 涵蓋初高中全部學科題庫&#xff0c;全國名校試卷最快更新。試卷新、試題全、解析準、完全免費&#xff0c;提供豐富試題輔助教師有效出試卷&#xff0c;組卷方便快捷。&#xff08;高中語文 高中數學 高中英語 高中物理 高中化學 高中生物 高中政…

2.10 stack

#include<stack> 后進先出 Last In First Out LIFO 插入和刪除元素只能在表的一端進行。 插入端 棧頂 Stack Top 入棧 Push 刪除端 棧底 Stack Bottom 出棧 Pop stack<int> s; s.push(1); //入棧 int i s.top(); //獲得棧頂元素 s.pop(); //出棧 s.size…

13結構型模式之橋接模式

概念 Bridge 模式又叫做橋接模式&#xff0c;是構造型的設計模式之一。Bridge模式基于類的最小設計原則&#xff0c;通過使用封裝&#xff0c;聚合以及繼承等行為來讓不同的類承擔不同的責任。它的主要特點是把抽象&#xff08;abstraction&#xff09;與行為實現&#xff08;i…

話說Svn與Git的區別

把第一條理解到位思想到位了做起來才會有的放矢&#xff0c;其他幾條都是用的時候才能體會到 1) 最核心的區別Git是分布式的&#xff0c;而Svn不是分布的。能理解這點&#xff0c;上手會很容易&#xff0c;聲明一點Git并不是目前唯一的分布式版本控制系統&#xff0c;還有比如M…

Ubuntu下Postgres安裝與配置

postgres8.4安裝配置&#xff1a;1.安裝postgres8.4~$ sudo apt-get install postgresql 2.修改超級管理員postgres密碼&#xff1a;以系統用戶運行psql~$ sudo -u postgres psql postgres修改postgres密碼(123456)postgres# /password postgres 3.備份修改的配置文件&#xff…

2.11 queue

#include<queue> 先進先出&#xff08;First In First Out, FIFO&#xff09; 隊尾插入&#xff0c;隊首刪除 queue<int> q; q.push(1); //入隊 int qf q.front(); //獲取隊首元素 int qe q.back(); //獲取隊尾元素 q.pop(); //出隊 q.size(); //大小 q.…

簡易中控紫貓插件版(3)壓縮包使用說明

1.環境配置腳本運行環境&#xff1a;沒什么說的 正常的最新版手機按鍵 當然還需要 最新的紫貓插件中控運行環境&#xff1a;首先要保證把壓縮包的所有php文件都扔到網站的根目錄下 必須保證網站的php版本是5.4 不然紫貓插件的php框架會出問題 然后你要知道網站數據庫的賬號和密…

Java9新特性

Java 8 發布三年多之后&#xff0c;即將快到2017年7月下一個版本發布的日期了。 你可能已經聽說過 Java 9 的模塊系統&#xff0c;但是這個新版本還有許多其它的更新。 這里有九個令人興奮的新功能將與 Java 9 一起發布。 1. Java 平臺級模塊系統 Java 9 的定義功能是一套全新的…

IOS 應用中從豎屏模式強制轉換為橫屏模式

在 iPhone 應用里&#xff0c;有時我們想強行把顯示模式從縱屏改為橫屏&#xff08;反之亦然&#xff09;&#xff0c;CocoaChina 會員 “alienblue” 為我們提供了兩種思路第一種&#xff1a;通過人為的辦法改變view.transform的屬性。具體辦法&#xff1a;view.transform一般…

2.12 priority_queue

#include<queue> priority_queue與queue的不同&#xff1a;最大元素位于隊首 priority_queue<int> pq; pq.push(1); //入隊 pq.pop(); //出隊 int i pq.top(); //獲取隊首元素 pq.size(); //大小 pq.empty(); //判空 如果隊列元素是結構體&#xff0c;重載&…

vue資料鏈接

vue 官方api&#xff1a;https://cn.vuejs.org/ vue資源精選&#xff1a;http://vue.awesometiny.com/ vue GitHub地址&#xff1a;https://github.com/vuejs/vue element-ui 官方中文api&#xff1a;http://element-cn.eleme.io/#/zh-CN/component/dropdown swiper中文網&…

Java面試常見算法

在程序員的職業生涯中&#xff0c;算法亦算是一門基礎課程&#xff0c;尤其是在面試的時候&#xff0c;很多公司都會讓程序員編寫一些算法實例&#xff0c;例如快速排序、二叉樹查找等等。 本文總結了程序員在代碼面試中最常遇到的10大算法類型&#xff0c;想要真正了解這些算法…

高仿人人Android夢想版終極源碼發送(轉)

經過幾個月的努力,終于基本完成了人人API擁有的所有功能,界面采用仿照人人夢想版5.13制作,其中資源文件也采用人人的APK文件資源,完成的功能及知識點如下:1.通過三種動畫仿照出人人引導頁的放大切換圖片的效果。2.通過重寫ViewGroup仿照出人人菜單和其他界面的手勢滑動切換效果…

HBase 基本Java API

數據庫&#xff1a;HBaseConfiguration HBaseAdmin 表&#xff1a;HTable HTableDescriptor 列族&#xff1a;HColumnDescriptor 行列操作&#xff1a;Put Get Scanner HBaseConfiguration: Configuration create() //從classpath中查找hbase-site.xml初始化Configu…

A1075.PAT Judge

題意 輸入k個程序的每個程序的滿分分數&#xff0c;再輸入m條用戶提交的記錄。按要求進行分數的排序最后輸出。是一道結構體的復雜排序 思路分析 首先明確本題的輸出要求&#xff1a; 編譯失敗的提交分數為-1。只有至少成功提交過一次程序(沒有編譯失敗),的用戶才會被排序。可以…

android 實現SSL握手協商

Android的私鑰和信任證書的格式必須是BKS格式的&#xff0c;通過配置本地JDK&#xff0c;讓keytool可以生成BKS格式的私鑰和信任證書,java本身沒有BouncyCastle密庫 ssl通道建立前必須進行協商&#xff08;形成安全的通道--隧道技術&#xff09;。 服務端&#xff1a; View Co…

同步阻塞的BIO、同步非阻塞的NIO、異步非阻塞的AIO

IO的方式通常分為幾種&#xff0c;同步阻塞的BIO、同步非阻塞的NIO、異步非阻塞的AIO。 一、BIO 在JDK1.4出來之前&#xff0c;我們建立網絡連接的時候采用BIO模式&#xff0c;需要先在服務端啟動一個ServerSocket&#xff0c;然后在客戶端啟動Socket來對服務端進行通信&#x…

1 概述

Unix C TCP/IP 三位一體 Linux天生是網絡操作系統 程序員的學習&#xff1a;不斷地敲代碼&#xff0c;不斷地看別人的代碼。 Linux兩大領域&#xff1a; &#xff08;1&#xff09;服務器 &#xff08;2&#xff09;嵌入式設備 www.netcraft.com 查看網站服務器系統 VMware快…

對我影響最大的三位老師

讀書也讀了那么多年了&#xff0c;遇見了許多的老師&#xff0c;他們教不同的科目&#xff0c;各司其職&#xff0c;兢兢業業的做著自己的本職工作。在我的學生時代印象最深的有三位老師。第一位是我的初中語文老師鄒老師&#xff0c;他上課非常有趣&#xff0c;語文課&#xf…