什么是父子容器

继承IOC的容器作为子容器,用来加载controller,modelandview等bean.

service,dao等bean用IOC加载。springmvc的IOC可以访问spring的IOC,但是spring的IOC不可以访问springmvc的IOC。

父子容器源码流程记录

两者加载时机,先通过ContextLoaderListener加载Spring上下文,然后再通过DispatcherServlet加载SpringMVC上下文.两者是父子关系,Listener加载的是父容器,Dispatcher加载的是子容器.


为什么会用父子容器,因为AbstractBeanFactory加载配置很多都是先从父BeanFactory加载,如果拿不到,才去子BeanFactory里面获取.

比如org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean里面有很多代码
org.springframework.beans.factory.support.AbstractBeanFactory#getParentBeanFactory 就是先获取父容器.如果父容器里面没有的话才会去子容器里面获取.

如果Controller配置到了父容器里面,你从子容器里面是可以获取到的.这是先找父再找子的过程.


在Spring父容器中注册的Bean对于SpringMVC容器中是可见的,而在SpringMVC容器中注册的Bean对于Spring父容器中是不可见的,也就是子容器(SpringMVC)可以看见父容器(Spring)中的注册的Bean,反之就不行。


如果记不住可以仔细想想Controller注入了Service层, 说明SpringMVC可以访问Spring里面的bean.

父子容器 - 图1