springMVC容器和Spring容器

前段時間有人問我,爲何必定要在web.xml中配置spring的listener呢?web

<listener>
<description>spring監聽器</description>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

自己咱們都知道,這個listener是告訴容器,啓動的時候建立spring容器,並加載咱們在context-param中配置的contextConfigLocation對應的配置文件的bean。spring

那麼這一步是必須的嗎?若是把這個listener註釋掉,發現啓動項目後報錯。spring-mvc

緣由:springMVC容器中的bean使用到spring容器中的bean。若是兩個容器之間的bean沒有關聯,則不會報錯。mvc

能夠在spring-mvc.xml中import spring.xml,發現啓動就不會報錯app

<import resource="spring.xml"/>

結語:使用spring容器的目的,我認爲就是爲了區分哪些bean是能夠脫離web環境使用的。this

注:springmvc的容器建立是在DispatchServlet初始化時建立的。spa

----------------------------------------------------------------------------------------------------------------------------------------------xml

Spring和springMVC父子容器的關係

邏輯分析可知:ip

1,Spring容器的啓動是先於SpringMVC容器的,因此spring容器是不知道springMVC容器的存在的。也就是說父容器沒法使用子容器的bean。servlet

2,當父容器初始化好以後,會將本身放到servletcontext的屬性中:

servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);

那麼,子容器在初始化時,就能獲得父容器的存在。子容器能夠使用父容器的bean。

 

爲何Controller註冊在父容器中,<mvc:annotation-driver/>註冊在子容器中時,springMVC沒法處理請求呢?

答:RequestMappingHandleMapping在找controller時,默認是不會從父容器中找的。因此咱們能夠手動的配置它從父容器找。可是這樣針對特定的HandlerMapping配置很差。

能夠配置controller使用子容器裝載。這樣既分工明確,又能夠免於配置。

相關文章
相關標籤/搜索