Spring controller 和 service的併發以及單多例

          controller 和service的單例和多例在很多時候其實都有併發問題的影響,但是絕大多數情況,很多人沒有在意,只有踩坑了才發現。 

          按照我以前的測試,可以發現,controller層如果不輸入@Scope("prototype"),那麼默認是單例的,但是controller 裏的@Autowired呢?又暈了,乾脆自己做了個簡單的測試。

controller 層 不加 @Scope("prototype"),紅字輸出

         

Service 不加 @Scope("prototype"),紅字輸出

 

 

啓動項目,刷新五次

結果可知。 controller 和 service 層 不加@Scope("prototype"),全部默認爲單例!也就是說@Autowired也是單例形式。

對controller 和 service 層,都加@Scope("prototype")

        可知,加@Scope("prototype")後,都變爲了多例模式。

         我還測試了,controller 加@Scope("prototype"),service 不加@Scope("prototype")

從該結果,也可證明 @Autowired是從容器中單例取出來了對象。只是我們平時使用過程中,一般沒有用成員變量累加,或者說一般都是隻用了mapper  和 方法內的局部變量是沒有問題的,但是在有成員變量的變動情況下,這是很危險的。

 

那麼getBean 和refrence是什麼結果呢,也可以一起測一下。

將@Autowired改成@Resource其餘的不變(service 層不改,現在是controller 加@Scope("prototype"),service 不加@Scope("prototype"))

結果爲:

結果可知:@Resource也是默認單例的獲取bean

那麼getBean呢?

結果可知:@getBean也是默認單例的獲取bean(getBean有很多方法,我只是測試了根據名字,這一塊我後面會做更詳細的測試)

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