SpringMVC的控制器單例問題

2021-10-21 01:58:46 字數 1509 閱讀 5501

springmvc中,controller、service、dao層的預設的scope是singleton;

:scope是springioc容器中的乙個作用域,在 spring ioc 容器中具有以下幾種作用域:基本作用域singleton(單例)、prototype(多例),web 作用域(reqeust、session、globalsession),自定義作用域。

a.singleton單例模式 – 全域性有且僅有乙個例項

b.prototype多例模式 – 每次獲取bean的時候會有乙個新的例項

c.request – request表示該針對每一次http請求都會產生乙個新的bean,同時該bean僅在當前http request內有效

d.session – session作用域表示該針對每一次http請求都會產生乙個新的bean,同時該bean僅在當前http session內有效

e.globalsession – global session作用域類似於標準的http session作用域,不過它僅僅在基於portlet的web應用中才有意義

1.singleton(單例),兩個變數,乙個普通成員變數,乙個靜態成員變數

結論:

1.不管是私有的還是公有的普通成員變數,因單例模式,只有乙個例項,所以普通成員變數是共用的,無論呼叫多少次,a的值會一直變化增加。

2.靜態變數位於方法區中的靜態區。單獨劃分的一塊儲存空間,不與具體的物件繫結在一起,該儲存空間被類的各個物件所共享,所以b的值會一直增加。

2.prototype(單例),兩個變數,乙個普通成員變數,乙個靜態成員變數

結論:

1.因多例模式,每次呼叫都會建立新的例項,所以普通成員變數每次都被初始化,無論呼叫多少次,a的值只會加一次變成1。

2.靜態變數位於方法區中的靜態區。單獨劃分的一塊儲存空間,不與具體的物件繫結在一起,該儲存空間被類的各個物件所共享,靜態成員變數不會被初始化,所以每呼叫一次b的值就會增加一次。

3.將註解@scope去掉,兩個變數,乙個普通成員變數,乙個靜態成員變數

結論:結果與1相同,所以說springmvc預設是單例模式

總結:

springmvc預設是單例模式,如果類中定義了普通成員變數,那麼在多執行緒訪問的時候是執行緒不安全的,只要不定義普通成員變數,那麼單例模式是執行緒安全的。如果非要定義乙個非靜態成員變數,將註解@scope的value屬性設定成prototype(多例模式),多列模式由於每次請求都建立乙個例項,所以會消耗較多的記憶體空間,速度會慢於單例模式。

SpringMVC註解控制器詳解

主要包括四類 component repository service controller 說明 controller 控制層,就是我們的action層 service 業務邏輯層,就是我們的service或者manager層 repository 持久層,就是我們常說的dao層 componen...

概述SpringMVC後端控制器

1.概述springmvc後端控制器 為了方便開發人員快捷地建立適合特定應用的後端控制器,springmvc實現controller介面,自定義了許多特定控制器。這些控制器的層次關係如下 abstractcontroller abstracturlviewcontroller urlfilename...

SpringMVC之控制器controller

import org.springframework.stereotype.controller controller public class logincontroller 解釋 1 controller註解宣告該類是乙個控制器 3 return index 返回檢視 index.jsp res...