Spring框架之爲什麼不在spring容器管理controller,而交給mvc

Spring容器與SpringMVC容器

1.疑問:為什麼不用spring去管理所有類?

我們配置springMVC 中,為什麼controller不直接交給spring 管理而要spring MVC容器單獨分開來管理

2.Spring容器 與 SpringMVC關係

Spring容器與SpringMVC容器是父子關係,子容器可以訪問父容器的對象,父容器不能訪問子容器的類,如果我們在springMVC配置

文件中,直接掃描所有類,把service、dao、controller都交給SpringMVC去管理是可以的,但是假如用spring去管理

Contoller,它是訪問不到這個類的,因為contoller是在springMVC容器中,假如在Spring配置直接掃描所有類包括

controller,而不配置springMVC的話,這樣服務器發來的請求,將會出現404的問題,因為它找不到controller,spring

無法注入Controller

例如:

在applicationContext-service中配置:

會掃描@Controller、@Service、@Repository、@Compnent

Springmvc.Xml中不掃描。

結論:springmvc。不能提供服務,因為springmvc子容器中沒有controller對象。

3.為什麼不直接在SpringMVC.xml中掃描所有類?

原則上我們是可以把service、dao

和controller都交給springMVC去管理,直接在SpringMVC配置文件中讓它掃所有包就可以,但是出於未來擴展的考慮,spring

和springMVC分開配置,由 spring 去管理service,有利於以後擴展,即便以後加多個struct2也不用影響原有配置

------------------------------------------------------------------------------------------------------------------------------------

一、Spring容器和springmvc容器的關係如下圖所示:

Spring框架之為什麼不在spring容器管理controller,而交給mvc

Spring和springmvc和作為兩個獨立的容器,會把掃描到的註解對象分別放到兩個不同的容器中,

Springmvc容器是spring容器的一部分,他們訪問對象的範圍如下所示:

①:springmvc子容器可以訪問spring父容器中的對象

②:spring父容器不能訪問springmvc子容器中的對象

***在實際應用中的實例***

一般情況下,一個spring / springmvc / mybatis 組合的框架中,會存在以下幾個配置文件:

  1. applicationContext-service.xml 文件
  2. 說明:在這個裡面存在著一個spring的註解掃描器。用來掃描@Service的註解
  3. Springmvc.xml 文件
  4. 說明:這個裡面存在著springmvc的註解掃描器,專門用來掃描@Controller的註解
  5. 然後呢?有點同學可能會想,我能不能合併成一個註解掃描器,來完成對象注入的問題?將配置文件中的註解掃描器更改為如下配置:
  6. 在applicationContext-service.xml文件中進行全局掃描的配置:
  7. 而在springmvc中不配置註解掃描器
  8. 說明:用這個掃描器分別掃描service層和controller層的註解:@Service /@Controller / @Autowired
  9. 當一旦採用這種方式之後,spring會將掃描的對象都會存放到spring的容器,而不會放到springmvc子容器中,當訪問項目的時候,
  10. springmvc找不到處理器映射器,和其對應的Controller,進而報404錯誤!
  11. 不用spring容器,只用springmvc容器行不行呢?
  12. 答案:是可以的,在這個裡面可以同時掃描Controller層、service層、dao層的註解。
  13. 在springmvc 和 spring 都有註解掃描的前提下,能不能將事務配置在Controller層?
  14. 答案:是不能的,因為事務管理器是配置在spring容器中的,如果將事務配置在Controller層的話,spring容器就訪問不了springmvc子容器,
  15. 進而無法訪問到事務對象。進而導致事務失效。

以上部分內容轉自:https://www.cnblogs.com/Prozhu/p/6709320.html


分享到:


相關文章: