spring與springMVC的父子容器關係

背景和概述前端

在spring與springMVC中經過IOC能夠管理bean對象,有兩個配置文件能夠配置iocjava

spring的配置文件applicationContext.xml
springMVC的配置文件springMVC.xml
工做中咱們用spring來管理service層和repertory層的bean對象,而讓springMVC去管理controller。
  
那麼很天然有以下的疑問?程序員

一、能不能用springMVC的配置文件springMVC.xml來管理所有的bean對象,包括controller,service,dao?
二、能不能用spring的配置文件applicationContext.xml來管理所有的bean對象,包括controller,service,dao?
答案是這樣的web

  徹底能夠用在spingMVC的而配置文件中來管理所有的Bean對象,可是不能夠用spring來管理controller。spring

爲何是這樣的?架構

Spring和SpringMVC父子容器關係mvc

  在Spring總體框架的核心概念中,容器是核心思想,就是用來管理Bean的整個生命週期的,而在一個項目中,容器不必定只有一個,Spring中能夠包括多個容器,並且容器有上下層關係,目前最多見的一種場景就是在一個項目中引入Spring和SpringMVC這兩個框架,那麼它其實就是兩個容器,Spring是父容器,SpringMVC是其子容器,而且在Spring父容器中註冊的Bean對於SpringMVC容器中是可見的,而在SpringMVC容器中註冊的Bean對於Spring父容器中是不可見的,也就是子容器能夠看見父容器中的註冊的Bean,反之就不行。app

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>
1
2
3
4
  或者能夠利用註解驅動去自動加載。

<!-- 註解驅動:
做用:替咱們自動配置最新版的註解的處理器映射器和處理器適配器
-->
<mvc:annotation-driven></mvc:annotation-driven>
1
2
3
4
  值得注意的是,springMVC在調用HandlerMapper進行url到controller函數方法映射解析的時候,HandlerMapper會在springMVC容器中尋找controller,也就是在子容器中尋找,不會去父容器spring容器中尋找的,因此當用spring的applicationContext.xml中配置了controller後,在訪問頁面的時候會出現404錯誤。

咱們來總結一下
  這樣咱們在清楚了spring和springMVC的父子容器關係、以及掃描註冊的原理之後,根據官方建議咱們就能夠很好把不一樣類型的Bean分配到不一樣的容器中進行管理。再出現Bean找不到或者SpringMVC不能跳轉以及事務的配置失效的問題

 

https://blog.csdn.net/u010758410/article/details/79950801

 

在說父子容器以前,我們首先了解什麼是容器:

java容器:

    能夠管理對象聲明週期,對象間的依賴關係。還能夠配置對象名稱,屬性,產生方式等。不用程序員本身編寫程序來管理。

java中經常使用的容器類有:List、HashMap、HashTable等。

 

spring容器:

借用覺得博主的總結:

    spring有兩個核心接口:BeanFactory和ApplicationContext,其中ApplicationContext是BeanFactory的子接口。他們均可表明Spring容器,Spring容器是生成Bean實例的工廠,而且管理容器中的Bean。

    Bean是Spring管理的基本單位,在基於Spring的Java EE應用中,全部的組件都被當成Bean處理,包括數據源、hibernate的SessionFactory、事務管理器等。在Spring中,Bean的是一個很是廣義的概念,任何的Java對象、Java組件都被當成Bean處理。

 

瞭解了什麼是容器,接下來就進入正題:

    在一個項目中,容器不必定只有一個,就拿我正在學習的ssm框架來講:spring能夠包含多個容器,好比說springmvc容器。在搭建項目的時候咱們作了好多的配置:

好比:在springmvc.xml中配置了一個掃描包,掃描controller中的註解。(後邊的mvc:annotation-driven表明使用註解驅動,能夠不寫)

 

又好比:在service.xml中配置了掃描包,要掃描service中的註解

 

 

     那問題就來了,既然spring容器是一個大的容器,那我可不能夠,寫一個全局掃描包把service/dao/controller都掃描到spring容器中呢?這樣會不會更方便一點不用配置那麼多的xml文件?

 

 

針對這個問題,咱們一塊兒來學習一下:

     Spring 是一個容器,springmvc也是一個容器。他們二者之間是父子容器關係。springmvc是子容器,包含在spring容器中。在項目中的配置以下:

 

咱們在web.xml中配置了一個spring容器:用Listener加載初始化srping容器(這是一個大的容器)

 

還配了一個springmvc的前端控制器:(這是一個包含在springmvc中的一個容器。而springmvc又包含在spring容器中)

 

 

就至關於:service.dao在spring容器中,controller在springmvc容器中。

 

父子容器約定以下:

一、子容器能夠訪問父容器中的對象:

    也就是service 能夠注入到controller中。

    但反過來,controller就不能夠注入到service中。

    固然,若是controller和service在一個容器中,就能夠注入。

 

二、父容器不能夠訪問子容器中的對象:

    若是咱們在spirng中配置一個全局的掃描包,spring容器會把service,controller,dao都掃描放入spring這個大的容器中。這樣致使,springmvc中就沒有對象了,頁面訪問找不到對應的controller,就會報404錯誤。

    相反,若是咱們在springmvc中寫一個掃描包,把service、dao都注入到springmvc中,(也就是把spingmvc.xml中掃描包中的.controller去掉)是沒有問題的。由於springmvc也是一個spring容器。

 

三、咱們爲何要用spring加springmvc呢?

     固然是爲了系統之後的擴張方便。spring能夠整合多個框架,這樣咱們後邊若是想再加入一個struts到spring容器裏面,也是能夠的。

 

四、咱們可不能夠把事務配置到controller中?

     若是是spirng+springmvc這個架構是不能夠,由於事務管理器是在spring中配置的,在父容器中是訪問不了springmvc子容器中的controller的。因此不能夠。

     可是若是把全部掃描包都配置到springmvc中,那麼在controller是能夠配置事務的。

 

因此結論以下:不能夠在service.xml中配置一個全局掃描包來使用。

 

     瞭解了父子容器,咱們在搭建框架的時候,就會很容易的知道,我要配置什麼,配置到哪些地方。就會更深一步的瞭解框架的原理。

 

課外拓展:

      我在上網查詢父子容器的時候,發現了兩派配置容器的使用。

      第一派:網友稱爲傳統派,就是spring+springmvc的配置。和我上面講的同樣。沒什麼可說的

      第二派:叫激進派,就是把全部東西都配置到springmvc中,不要service或者dao層的接口,把作項目一全套的數據源啦,事務啦,dao啦,service啦,都配置到子容器中。

 

https://blog.csdn.net/lishaoran369/article/details/57073715

相關文章
相關標籤/搜索