前段時間有人問我,爲何必定要在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
邏輯分析可知:ip
1,Spring容器的啓動是先於SpringMVC容器的,因此spring容器是不知道springMVC容器的存在的。也就是說父容器沒法使用子容器的bean。servlet
2,當父容器初始化好以後,會將本身放到servletcontext的屬性中:
servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);
那麼,子容器在初始化時,就能獲得父容器的存在。子容器能夠使用父容器的bean。
答:RequestMappingHandleMapping在找controller時,默認是不會從父容器中找的。因此咱們能夠手動的配置它從父容器找。可是這樣針對特定的HandlerMapping配置很差。
能夠配置controller使用子容器裝載。這樣既分工明確,又能夠免於配置。