所謂容器,就是上下文,在這同一個上下文里,大家可以共享一些東西。
在Spring
應用啟動時,會先讀取web.xml
文件,調用ContextLoaderListener
創建Spring
容器,也就是你說的父容器。
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
Listener創建完之后,開始創建Servlet:
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
這時候這個DispatcherServlet
開始試圖創建SpringMVC
的ApplicationContext
,它先找剛才由上面那個ContextLoaderListener
創建的Spring
的ApplicationContext
,找到后,把Spring
的ApplicationContext
作為參數傳給DispatcherServlet
的ApplicationContext
的setParent
方法,這樣SpringMVC
的容器就變成了Spring
容器的兒子。
因為在SpringMVC這個子容器創建的時候指定了它的Spring父容器,所以兒子能找到父親,所以SpringMVC這個子容器里的Bean可以調用父容器的服務,而父容器不知道有這個兒子的存在(一個不負責任的父親),父容器里的Bean不能調用子容器里的服務。