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和springmvc和作為兩個獨立的容器,會把掃描到的註解對象分別放到兩個不同的容器中,
Springmvc容器是spring容器的一部分,他們訪問對象的範圍如下所示:
①:springmvc子容器可以訪問spring父容器中的對象
②:spring父容器不能訪問springmvc子容器中的對象
***在實際應用中的實例***
一般情況下,一個spring / springmvc / mybatis 組合的框架中,會存在以下幾個配置文件:
- applicationContext-service.xml 文件
-
- 說明:在這個裡面存在著一個spring的註解掃描器。用來掃描@Service的註解
- Springmvc.xml 文件
-
- 說明:這個裡面存在著springmvc的註解掃描器,專門用來掃描@Controller的註解
- 然後呢?有點同學可能會想,我能不能合併成一個註解掃描器,來完成對象注入的問題?將配置文件中的註解掃描器更改為如下配置:
- 在applicationContext-service.xml文件中進行全局掃描的配置:
- 而在springmvc中不配置註解掃描器
- 說明:用這個掃描器分別掃描service層和controller層的註解:@Service /@Controller / @Autowired
- 當一旦採用這種方式之後,spring會將掃描的對象都會存放到spring的容器,而不會放到springmvc子容器中,當訪問項目的時候,
- springmvc找不到處理器映射器,和其對應的Controller,進而報404錯誤!
- 不用spring容器,只用springmvc容器行不行呢?
- 答案:是可以的,在這個裡面可以同時掃描Controller層、service層、dao層的註解。
- 在springmvc 和 spring 都有註解掃描的前提下,能不能將事務配置在Controller層?
- 答案:是不能的,因為事務管理器是配置在spring容器中的,如果將事務配置在Controller層的話,spring容器就訪問不了springmvc子容器,
- 進而無法訪問到事務對象。進而導致事務失效。
以上部分內容轉自:https://www.cnblogs.com/Prozhu/p/6709320.html
閱讀更多 JAVA熊 的文章