Spring(十九):Spring 父子容器
Spring 的IoC
容器可以建立父子层级关联的容器体系,子容器可以访问父容器中的Bean
,但父容器不能访问子容器中的Bean
。
在容器内,Bean
的id
必须是唯一的,但子容器可以拥有一个和父容器id
相同的Bean
。父子容器体系增强了Spring容器架构的扩展性和灵活性,第三方可以通过HierarchicalBeanFactory
接口,为一个已经存在的容器添加一个或多个特殊用途的子容器,以提供一些额外的功能。
在SpringMVC
中,展现层Bean
位于一个子容器中,而业务层和持久层的Bean
位于父容器中,这样,展现层Bean
就可以引用业务层和持久层的Bean
,而业务层和持久层Bean
则看不到展现层Bean
。
Spring父容器是通过在web.xml
中配置ContextLoaderListener
监听器,加载applicationContext.xml
启动的。
SpringMVC子容器是通过配置DispatcherServlet
,加载springmvc.xml
启动的。
注意事项
- 子容器可以访问父容器中的
Bean
,父容器不可以访问子容器中的Bean
。
SpringMVC Controller
层有一个自己的容器,并且是Spring的子容器。
2. 子容器的初始化在父容器的后面。
在配置文件设置扫描包的层级时,Controller
层与Service,Dao
层必须严格限制在自己的配置文件扫描。
如果SpringMVC的配置文件扫包时包含了业务层和数据访问层的包,则在使用时,不能调用业务层和数据访问层的Bean
;即使Spring
配置文件包含了业务层和数据访问层包的扫描,也会被SpringMVC子容器的初始化覆盖。
3. SpringMVC与Spring使用的参数配置文件要分别独立,各自加载自己的参数配置文件。
参考:
spring的启动过程——spring和springMVC父子容器的原理
相同Bean分别被Spring MVC子容器与Spring父容器初始化,导致@Value注入失败
Spring(十九):Spring 父子容器
http://blog.gxitsky.com/2018/05/06/Spring-19-Spring-IOC-Parent-Child/