spring ioc容器和spring mvc 容器--------淺談!!


之前一直不理解,為啥項目中的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容器中的對象了!!

如果想深入了解,可以看源碼。。。本人表示看的頭大!!!-   -!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM