原创

Spring(十九):Spring 父子容器

SpringIoC容器可以建立父子层级关联的容器体系,子容器可以访问父容器中的Bean,但父容器不能访问子容器中的Bean

父子容器

在容器内,Beanid必须是唯一的,但子容器可以拥有一个和父容器id相同的Bean。父子容器体系增强了Spring容器架构的扩展性和灵活性,第三方可以通过HierarchicalBeanFactory接口,为一个已经存在的容器添加一个或多个特殊用途的子容器,以提供一些额外的功能。

SpringMVC中,展现层Bean位于一个子容器中,而业务层和持久层的Bean位于父容器中,这样,展现层Bean就可以引用业务层和持久层的Bean,而业务层和持久层Bean则看不到展现层Bean

Spring父容器是通过在web.xml中配置ContextLoaderListener监听器,加载applicationContext.xml启动的。
SpringMVC子容器是通过配置DispatcherServlet,加载springmvc.xml启动的。

注意事项

  1. 子容器可以访问父容器中的Bean,父容器不可以访问子容器中的Bean
    SpringMVC Controller层有一个自己的容器,并且是Spring的子容器。
  2. 子容器的初始化在父容器的后面。
    在配置文件设置扫描包的层级时,Controller层与Service,Dao层必须严格限制在自己的配置文件扫描。
    如果SpringMVC的配置文件扫包时包含了业务层和数据访问层的包,则在使用时,不能调用业务层和数据访问层的Bean;即使Spring配置文件包含了业务层和数据访问层包的扫描,也会被SpringMVC子容器的初始化覆盖。
  3. SpringMVCSpring使用的参数配置文件要分别独立,各自加载自己的参数配置文件。

参考资料

  1. spring的启动过程——spring和springMVC父子容器的原理
  2. 相同Bean分别被Spring MVC子容器与Spring父容器初始化,导致@Value注入失败
正文到此结束
本文目录