1. 程式人生 > >spring與springMVC的細節問題:父子容器關係,載入controller,404錯誤

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
    來管理全部的bean物件,包括controller,service,dao?

答案是這樣的

  完全可以用在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進行urlcontroller函式方法對映解析的時候,HandlerMapper會在springMVC容器中尋找controller,也就是在子容器中尋找,不會去父容器spring容器中尋找的,所以當用spring的applicationContext.xml中配置了controller後,在訪問頁面的時候會出現404錯誤

我們來總結一下
  這樣我們在清楚了spring和springMVC的父子容器關係、以及掃描註冊的原理以後,根據官方建議我們就可以很好把不同型別的Bean分配到不同的容器中進行管理。再出現Bean找不到或者SpringMVC不能跳轉以及事務的配置失效的問題
這裡寫圖片描述
參考文章:
https://www.cnblogs.com/hafiz/p/5875740.html