Fork me on GitHub

Spring IOC级联容器原理

spring mvc框架中的两级容器

  • spring mvc在开发中经常使用,一般我们在web.xml配置时候,都需要配置ContextLoaderListener和一个DispatcherServlet,那么这2个都起到什么所用呢?
  • 其实就是配置了2个spring ioc容器,并且DispatcherServlet创建IOC容器的父容器就是ContextLoaderListener创建的IOC容器
  • 一般配置如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    配置 ContextLoaderListener 

    <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>WEB-INF/applicationContext.xml</param-value>
    </context-param>

    配置 DispatcherServlet

    <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
    </servlet>
  • ContextLoaderListener 会创建一个由应用程序上下文 XMLWebApplicationContext 来管理的 IOC 容器,IOC 里面的 bean 是通过 配置的 contextConfigLocation 参数对应的 WEB-INF/applicationContext.xml 来注入的

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
    <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:springmvc-servlet.xml</param-value>
    </init-param>
    </servlet>
  • 以上配置完成后就会形成两级级联IOC容器了

    • spring sub context ———> spring root context

总结

  • 1 子容器无法访问子容器的bean,因为相互隔离
  • 2 子容器可以访问父容器的bean,因为子容器也是通过父容器创建的
  • 3 父容器无法访问子容器中的bean,不支持自顶向下访问