springmvc中的單例問題

2022-04-16 04:16:13 字數 1199 閱讀 2130

1,springmvc實際上是基於乙個叫做dispatcherservlet的servlet的。servlet按照以往的學習經驗,他是單事例多執行緒的。

servlet生命週期

1.裝載servlet。這項操作一般是動態執行的。然而,server通常會提供乙個管理的選項,用於在server啟動時強制裝載和初始化特定的servlet。

2.server建立乙個servlet的例項

3.server呼叫servlet的init()方法

4.乙個客戶端的請求到達server

5.server建立乙個請求物件

6.server建立乙個響應物件

7.server啟用servlet的service()方法,傳遞請求和響應物件作為引數

8.service()方法獲得關於請求物件的資訊,處理請求,訪問其他資源,獲得需要的資訊

9.service()方法使用響應物件的方法,將響應傳回server,最終到達客戶端。service()方法可能啟用其它方法以處理請求,如doget()或dopost()或程式設計師自己開發的新的方法。

10.對於更多的客戶端請求,server建立新的請求和響應物件,仍然啟用此servlet的service()方法,將這兩個物件作為引數傳遞給它。如此重複以上的迴圈,但無需再次呼叫init()方法。一般servlet只初始化一次(只有乙個物件),當server不再需要servlet時(一般當server關閉時),server呼叫servlet的destroy()方法。

2,springmvc中的@controller,@service等預設是單例的(configurablebeanfactory#scope_singleton),多執行緒的。

3,如果在@controller中存在例項變數的話,這個例項變數是被多個執行緒共享的,,造成執行緒不安全。所以不可避免的使用例項變數的時候,①,調整scope為configurablebeanfactory#scope_prototype,②,將變數修飾為localthread。

4,最重要的一點,今天一同事說道,可以在controller中對訪問作限流。我很詫異,不應該在controller之前作限流嗎?

他給出的解釋為:controller預設是單例的,並不是說會初始化很多個,而是所有的執行緒使用這乙個,get√,宣告乙個區域性變數semphare,最大值為限流的大小即可。

十分感謝他。

dispatcherservlet

springMVC單例問題

首先看個小demo restcontroller public class testcontroller public int testinstance2 依次訪問 http localhost 8082 reed test1 返回1 http localhost 8082 reed test1 返...

SpringMVC的控制器單例問題

springmvc中,controller service dao層的預設的scope是singleton 注 scope是springioc容器中的乙個作用域,在 spring ioc 容器中具有以下幾種作用域 基本作用域singleton 單例 prototype 多例 web 作用域 reqe...

java面試中單例問題

public class singltontest private static singltontest st public static singltontest getinstance synchronized singltontest.class return st 最開始的版本1.1 疏忽...