有了Spring,你不會明確地從工廠查找bean。相反,容器在使用它們之前初始化這些bean,所以你的代碼不必調用容器本身。
在Web應用程序中,通常會有Web控制器處理將Web請求和帖子轉換爲對業務邏輯的調用,事務處理實現業務邏輯的服務以及每個執行簡單查詢或更新的方法的數據訪問對象。 (所有這些通常都是無狀態的,唯一的實例成員是對其他無狀態對象的引用,並且它們可以同時執行多個請求。)每個層中的對象都依賴於下一層中的對象,並且Spring在啓動時將所有這些對象連接在一起。
如果我有一個使用服務的控制器,Spring會創建控制器和服務並將服務連接到控制器。應用程序代碼永遠不會調用bean工廠。
public class SomeWebController {
private MyBusinessLogicService myBusinessLogicService;
public SomeWebController(MyBusinessLogicService myBusinessLogicService) {
this.myBusinessLogicService = myBusinessLogicService;
}
...
}
單元測試不必知道容器。測試可以通過插入mock來獲取測試對象,通過創建這些依賴關係並直接調用setter方法,或者通過創建一個測試配置並在mock中插入這個插件來設置它的依賴關係。
如果我有一個不使用Spring的控制器,並且它直接使用它的構造函數實例化服務,那麼替換模擬服務就很困難。我將不得不像重構那樣爲服務引入一個工廠方法,並在測試中重寫它以返回一個模擬。這將在測試中引入樣板代碼,我必須將我正在測試的類進行子類化,並且在覆蓋的工廠方法未執行的情況下,我的覆蓋範圍中存在空白。
使用構造函數注入而不是場注入。然後,你仍然可以在單元測試中使用'new',爲依賴項提供模擬。 – chrylis
即使您打算使用'getBean'(1.使用構造函數注入,2.自動裝入您的測試類),請使用通用簽名。 – chrylis