以前一直不理解,爲啥項目中的web.xml要配置2個上下文!前端
即:java
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>court</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/court-service.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>web
servlet:表明的的容器爲spring-mvc的子容器,而DispatcherServlet 是前端控制器,該容器專門爲前端監聽請求的時候所用,就是說當接收到url請求的時候會引用springmvc容器內的對象來處理。spring
context-param:表明的容器是spring自己的容器,spring-mvc能夠理解爲一個繼承自該容器的子容器,spring容器是最頂層的父類容器,跟java的繼承原理同樣,子容器能使用父類的對象,可是父容器不能使用子類的對象。spring-mvc
因此這2個上下文同時出如今web.xml這個配置文件中其實並不衝突,可是要注意2個容器的對象不要重複注入了哈!!!!服務器
初始化的順序也是父類容器優先級高,當服務器解析web.xml的時候因爲listener監聽的緣由,會優先初始化spring容器,以後才初始化spring-mvc容器。mvc
介紹完基本概念後就說說以前碰到的問題,因爲之前一直用url請求的方式來作交互,因此當時也沒有去考慮在web.xml配置spring容器,並且若是項目只存在單純的url請求交互這樣的形式,其實能夠單純的一個spring-mvc這個容器來管理對象便可(有些公司爲了井井有條,可能把除去controller控制層之外的對象放在父容器中,即在web.xml配置2個容器)。前段時間項目中忽然加入了webservice,經過ws來發送請求,而不走前端控制器。因此那個時候發如今webService中沒法用註解的形式注入對象,只能以傳統的 方式建立spring容器而後建立須要的對象,這樣依賴若是依賴的服務不少的話,就得不停的建立對象。這樣的場景下spring-mvc容器中的對象其實對於全部的ws請求都是不可調用的,而解決的辦法就是在web.xml建立spring容器,在項目啓動的時候就將要用的服務對象初始化好,而且讓ws的服務實現繼承SpringBeanAutowiringSupport這個父類。這樣ws在調用的時候就能夠直接依賴到spring容器中的對象了!!app
若是想深刻了解,能夠看源碼。。。本人表示看的頭大!!!- -!url