2012-10-11 275 views
7

我正在使用一個控制器調用第二個控制器上的方法的現有代碼。到目前爲止我已經看到了2個實現。Spring MVC,從控制器內部調用另一個控制器

1日實施

return new Controller().method(request, response); 

第二實施

@Autowired 
private Controller controller. 

return this.controller.method(request, response); 

哪個是正確的實現,有什麼問題,如果任何與其中一方。

+0

這樣做有什麼好處?這樣做打破了許多約定,你應該考慮修改,即分解控制器代碼,並可能將一些邏輯移入業務層。 – dardo

回答

9

事實上,您需要從另一個控制器調用方法,這顯示出可能的設計缺陷。

使用選項1,您將失去Spring DI容器帶給您的所有內容:即,其他控制器可能會被Spring實例化,並且其他一些依賴關係會被連接到它。如果你自己實例化它,即使它現在可以工作,因爲你可能沒有@Autowired/@Value依賴關係,一旦你添加了對其他資源的依賴關係,它就會中斷。此外,您已經有一個爲您創建容器的實例,爲什麼要創建其他實例?

1

第一個需要更多的工作,首先你是否真的想每次創建一個Controller類的新實例?

第二種使用稱爲依賴注入或反轉控制的模式更好。讓Spring爲你管理bean的範圍,默認情況下它只會創建Controller類的一個實例,但是如果在某個時候(由於某種原因)你不希望這種行爲很容易創建很多實例...

9

聽起來像你需要重構代碼。將兩個控制器之間的共同點提取到一個單獨的類中,然後從任一控制器調用它。

+2

+1爲好的做法,並從密爾沃基,並基本上重申我的意見。 – dardo

4

你完全錯了。請參閱Costi Ciudatu's回答有什麼不對。

解決方案:我建議您將service layer and dao layer classes與您的controllers相關聯。 假設你有AccountController,你將有AccountService類(接口+實現)和AccountDao(接口+實現)。

現在,如果在(LoginController)用戶登錄,你需要考慮,所以你會在LoginController自動裝配AccountService,你會得到AccountService方法用戶帳戶的詳細信息。

9

如果您在控制器之間進行調用,或者存在缺陷或者您想進行重定向,這是完全有效的。 如果重定向的話就在你的控制器方法返回如下:

return "redirect:/yourDestinationControllerPath"; 
相關問題