2016-09-13 44 views
0

我對依賴注入有疑問,假設我的控制器,服務,dao都是單例,所以通常當我們創建控制器時,我們將服務注入爲該類的實例變量,但根據單身模式如果我們的控制器是無狀態的,那麼只有我們不會面臨任何併發問題,但在這裏我們聲明服務依賴關係,所以它不應該是無狀態的,所以我們必須照顧同步?@Controller @Service @Repository的UnderStanding

請清除這個疑問,因爲我是初學者,所以我希望它的自然有這個懷疑,我不知道我是否完全錯誤思想,請幫助。

+0

你認爲你需要什麼樣的同步? – OrangeDog

+0

我只想知道,如果我是控制器類中的注入服務bean,它在自然界是單例,所以通過這樣做,我使控制器成爲有狀態的本質?如果我這樣做,我不會做任何錯誤的事情,因爲無處不在,它提到任何單例bean應該是無狀態的,以防止併發。 –

+0

你爲什麼認爲服務不應該是無國籍的? 所有的singleton bean應該是無狀態的(線程安全的) – mokarakaya

回答

0

如果您的服務和控制器是無狀態的,則可以將一個注入另一個。

你不應該聲明任何保持這些類中的狀態的變量。最終的變數是可以的。

如果所有操作都是在方法中定義的,並且它們不使用類的任何變量,那麼您所做的依賴注入是完全安全的。

+0

完全是我的觀點,請您解釋一下,當我使用服務類 –

+0

中的mybatis和jdbc自動裝配數據傳輸時,是否會發生同樣的情況; https://github.com/mkarakaya/spring-boot-multi-module-maven/blob /master/api/src/main/java/com/apiDemo/service/BanksService.java 正如您所看到的,每個對象都是在方法中創建和使用的,因此它是完全無狀態的。和存儲庫類是單身。 – mokarakaya

+0

感謝您的回答:) –

0

默認情況下,Spring中的所有bean都是單例。這包括任何@Controller,@Service,@Repository等,以及任何xml定義的bean。

您可以閱讀thisthis

Java basic variable tutorial

一個對象如何在字段中存儲其狀態類似的局部變量,一個 方法往往會存儲在局部變量的臨時狀態。用於聲明局部變量的語法與 (例如,int count = 0;)類似。沒有特定關鍵字指定 作爲本地變量;該決定完全來自 聲明變量的位置 - 這是 方法的開始和結束括號之間的位置。因此,局部變量是 ,只有在它們被聲明的方法中才可見;他們不是 從班上其他人可以訪問。

+0

謝謝,但據我的理解你的意思是,當我的控制器自動創建服務bean時,它只有在服務也是無狀態的時候纔會保持任何狀態,這樣多個請求只會共享駐留在堆棧中的類的本地成員不同的請求線程 –

+0

當你說「班級的本地成員」時,你是什麼意思?你是否打算讓你的服務(或任何其他組件)擁有任何有狀態的財產? – jlumietu

+0

對不起,我的錯誤不是類的本地成員,我的意思是類的方法在自然界中是公共的,它們的局部變量 –

0

這就是爲什麼在聲明從屬服務時需要使用@Autowired。初始化過程有效地交給Spring框架,而不是自己實例化。由於Spring只有無狀態bean,因此你將一個無狀態單例注入到另一個無狀態單例中,所以不需要手動管理線程。

相關問題