之前一直不理解,為啥項目中的web.xml要配置2個上下文!
即:
<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>
servlet:代表的的容器為spring-mvc的子容器,而DispatcherServlet 是前端控制器,該容器專門為前端監聽請求的時候所用,就是說當接收到url請求的時候會引用springmvc容器內的對象來處理。
context-param:代表的容器是spring本身的容器,spring-mvc可以理解為一個繼承自該容器的子容器,spring容器是最頂層的父類容器,跟java的繼承原理一樣,子容器能使用父類的對象,但是父容器不能使用子類的對象。
所以這2個上下文同時出現在web.xml這個配置文件中其實並不沖突,但是要注意2個容器的對象不要重復注入了哈!!!!
初始化的順序也是父類容器優先級高,當服務器解析web.xml的時候由於listener監聽的原因,會優先初始化spring容器,之后才初始化spring-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容器中的對象了!!
如果想深入了解,可以看源碼。。。本人表示看的頭大!!!- -!
