SpringMVC的控制器【Controller】是單例的嗎?探討一下

前言

瀏覽一位博主的文章,發現一例比較有意思的面試點,特此記錄,以便他日所需。

SpringMVC Controller到底是單例和多例,舉例說明,如下:

✍第一次:類是多例,一個普通屬性和一個靜態屬性。
在這裏插入圖片描述
在這裏插入圖片描述
運行結果:

普通屬性:0.............靜態屬性:0
普通屬性:0.............靜態屬性:1
普通屬性:0.............靜態屬性:2
普通屬性:0.............靜態屬性:3

所以說:對於多例情況普通屬性是不會共用的,不會產生影響,對於靜態屬性會去共用這個屬性。
第二次:類改爲單例
在這裏插入圖片描述
運行結果:

普通屬性:0.............靜態屬性:0
普通屬性:1.............靜態屬性:1
普通屬性:2.............靜態屬性:2
普通屬性:3.............靜態屬性:3

所以說:對於單例情況普通屬性靜態屬性都會被共用。

第三次:類去掉@Scope註解
在這裏插入圖片描述
運行結果:

普通屬性:0.............靜態屬性:0
普通屬性:1.............靜態屬性:1
普通屬性:2.............靜態屬性:2
普通屬性:3.............靜態屬性:3

所以說:springmvc默認是單例的。

總結

  儘量不要在controller裏面去定義屬性,如果在特殊情況需要定義屬性的時候,那麼就在類上面加上註解 @Scope(“prototype”) 改爲多例的模式,可以共用普通屬性.

  以前struts是基於類的屬性進行發的,定義屬性可以整個類通用,所以默認是多例,不然多線程訪問肯定是共用類裏面的屬性值的,肯定是不安全的,但是springmvc是基於方法的開發,都是用形參接收值,一個方法結束參數就銷燬了,多線程訪問都會有一塊內存空間產生,裏面的參數也是不會共用的,所有springmvc默認使用了單例.

  所以controller裏面不適合在類裏面定義屬性,只要controller中不定義屬性,那麼單例完全是安全的。Springmvc這樣設計主要的原因也是爲了提高程序的性能和以後程序的維護只針對業務的維護就行,要是struts的屬性定義多了,都不知道哪個方法用了這個屬性,對以後程序的維護還是很麻煩的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章