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 疏忽...