看到一篇對(duì)于Spring Controller的單例問(wèn)題分析的非常好,轉(zhuǎn)載如下
springmvc controller默認(rèn)的是單例singleton的,具體可以查看注解scope可以一目了然。
單例的原因有二:
1、為了性能。
2、不需要多例。
1、這個(gè)不用廢話(huà)了,單例不用每次都new,當(dāng)然快了。
2、不需要實(shí)例會(huì)讓很多人迷惑,因?yàn)閟pring mvc官方也沒(méi)明確說(shuō)不可以多例。
我這里說(shuō)不需要的原因是看開(kāi)發(fā)者怎么用了,如果你給controller中定義很多的屬性,那么單例肯定會(huì)出現(xiàn)競(jìng)爭(zhēng)訪(fǎng)問(wèn)了。
因此,只要controller中不定義屬性,那么單例完全是安全的。下面給個(gè)例子說(shuō)明下:

測(cè)試代碼
默認(rèn)單例的,隨著請(qǐng)求次數(shù)的增加:
0 | 0
1 | 1
2 | 2
3 | 3
4 | 4
...
controller增加注解:

增加多例注解
此時(shí),無(wú)論多少次請(qǐng)求,結(jié)果為:
0 | 0
1 | 0
2 | 0
3 | 0
4 | 0
...
從以上很容易看出,單例是線(xiàn)程不安全的,會(huì)導(dǎo)致屬性的重復(fù)性利用。
最佳實(shí)踐:
1、不要在controller中定義成員變量。
2、萬(wàn)一必須要定義一個(gè)非靜態(tài)成員變量時(shí)候,則通過(guò)注解@Scope("prototype"),將其設(shè)置為多例模式