對於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的屬性定義多了,都不知道哪個方法用了這個屬性,對以後程式的維護還是很麻煩的。
SpringMVC Controller單例陷阱
使用 springmvc 有一段時間了 之前一直使用 struts2,在struts2 中action 都是原型 prototype 的,說是因為執行緒安全問題,對於 springmvc 中bean 預設都是 singleton 單例的,那麼用 controller 註解標籤注入的 controll...
SpringMVC Controller單例和多例
對於springmvc controller單例和多例,下面舉了個例子說明下.第一次 類是多例,乙個普通屬性和乙個靜態屬性。結果 普通屬性 0.靜態屬性 0 普通屬性 0.靜態屬性 1 普通屬性 0.靜態屬性 2 普通屬性 0.靜態屬性 3 所以說 對於多例情況普通屬性時不會共用的,不會產生影響,對...
SpringMVC Controller單例和多例
對於springmvc controller單例和多例,下面舉了個例子說明下.第一次 類是多例,乙個普通屬性和乙個靜態屬性。結果 普通屬性 0.靜態屬性 0 普通屬性 0.靜態屬性 1 普通屬性 0.靜態屬性 2 普通屬性 0.靜態屬性 3 所以說 對於多例情況普通屬性時不會共用的,不會產生影響,對...