spring與springMVC的細節問題:父子容器關係,載入controller,404錯誤
背景和概述
在spring與springMVC中通過IOC可以管理bean物件,有兩個配置檔案可以配置ioc
spring
的配置檔案applicationContext.xml
springMVC
的配置檔案springMVC.xml
工作中我們用spring
來管理service
層和repertory
層的bean
物件,而讓springMVC
去管理controller
。
那麼很自然有如下的疑問?
- 1、能不能用
springMVC
的配置檔案springMVC.xml
來管理全部的bean物件,包括controller,service,dao? - 2、能不能用
spring
的配置檔案applicationContext.xml
答案是這樣的
完全可以用在spingMVC的而配置檔案中來管理全部的Bean物件,但是
不可以用spring來管理controller。
為什麼是這樣的?
Spring和SpringMVC父子容器關係
在Spring整體框架的核心概念中,容器是核心思想,就是用來管理Bean的整個生命週期的,而在一個專案中,容器不一定只有一個,Spring中可以包括多個容器,而且容器有上下層關係,目前最常見的一種場景就是在一個專案中引入Spring和SpringMVC這兩個框架,那麼它其實就是兩個容器,Spring是父容器,SpringMVC是其子容器,並且在Spring父容器中註冊的Bean對於SpringMVC容器中是可見的,而在SpringMVC容器中註冊的Bean對於Spring父容器中是不可見的,也就是子容器可以看見父容器中的註冊的Bean,反之就不行。
spring與springMVC的細節問題
spring是一個IOC容器,springMVC可以看做是一個springIOC容器的一個子容器,這個子容器有自己獨有的邏輯和方法。其其中很重要的有:HandlerMapper
(處理器對映器),和HandlerAdapter
(處理器介面卡),其配置如下:
<!-- 配置最新版的註解的處理器對映器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean >
<!-- 配置最新版的註解的處理器介面卡 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>
或者可以利用註解驅動去自動載入。
<!-- 註解驅動:
作用:替我們自動配置最新版的註解的處理器對映器和處理器介面卡
-->
<mvc:annotation-driven></mvc:annotation-driven>
值得注意的是,springMVC
在呼叫HandlerMapper
進行url
到controller
函式方法對映解析的時候,HandlerMapper
會在springMVC
容器中尋找controller,也就是在子容器中
尋找,不會去父容器
spring容器中尋找的,所以當用spring的applicationContext.xml中配置了controller後,在訪問頁面的時候會出現404錯誤。
我們來總結一下
這樣我們在清楚了spring和springMVC的父子容器關係、以及掃描註冊的原理以後,根據官方建議我們就可以很好把不同型別的Bean分配到不同的容器中進行管理。再出現Bean找不到或者SpringMVC不能跳轉以及事務的配置失效的問題
參考文章:
https://www.cnblogs.com/hafiz/p/5875740.html