Spring+SpringMVC项目中的容器初始化过程

📅 发布时间:2026/7/7 22:09:52 👁️ 浏览次数:
Spring+SpringMVC项目中的容器初始化过程
文章目录容器初始化过程初始化过程简单概括初始化过程初始化流程图Filter、Servlet等无法自动注入Bean容器初始化过程web.xml配置文件?xml version1.0 encodingUTF-8? web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaee xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd version4.0 !--定义web应用的名称-- display-namessmdemo/display-name context-param param-namecontextConfigLocation/param-name param-value/WEB-INF/spring/spring-context.xml/param-value /context-param !-- Spring上下文监听器用来加载Spring的上下文配置并初始化Spring -- listener description启动spring容器/description listener-classorg.springframework.web.context.ContextLoaderListener/listener-class /listener !-- LOG4J上下文监听器用来加载LOG4J2的配置并初始化LOG4J -- listener listener-classorg.apache.logging.log4j.web.Log4jServletContextListener/listener-class /listener !-- 字符编码过滤器将编码改为UTF-8-- filter filter-nameencodingFilter/filter-name filter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-class init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param init-param param-nameforceEncoding/param-name param-valuetrue/param-value /init-param /filter !--对所有的请求都进行过滤-- filter-mapping filter-nameencodingFilter/filter-name url-pattern/*/url-pattern /filter-mapping !-- SpringMVC前置控制器拦截匹配的请求把拦截下来的请求根据相应的规则分发到目标Controller来处理-- servlet servlet-namespring-mvc/servlet-name servlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class !-- 指定路径SpringMVC上下文配置路径也可以使用默认的规则即/WEB-INF/servlet-name-servlet.xml如spring-mvc-servlet.xml-- init-param param-namecontextConfigLocation/param-name param-value/WEB-INF/spring/spring-mvc.xml/param-value /init-param !-- 随web应用启动而启动 -- load-on-startup1/load-on-startup /servlet servlet-mapping servlet-namespring-mvc/servlet-name !--指定所有请求都通过DispatcherServlet来处理-- url-pattern//url-pattern /servlet-mapping /web-app初始化过程Web服务器如Tomcat启动Tomcat读取server.xml配置文件加载里面配置的Web应用为每个应用创建一个全局上下文环境ServletContextApplicationContextFacadeTomcat读取web.xml配置文件开始按顺序加载context-param、listener、filter、servlet获取context-param节点信息保存到ServletContext中值为Spring配置文件的位置获取listener节点信息创建Listener实例集合开始监听其中的ContextLoaderListener监听器就是用来完成Spring容器初始化的。ContextLoaderListener监听触发完成Spring容器XmlWebApplicationContext的初始化创建Spring容器通过ServletContext.getinitialParameter“contextConfigLoaction”从ServletContext中获取Spring配置文件的位置读取Spring配置文件信息将相关Bean加载到Spring容器中。Spring容器加载完成将容器保存到ServletContext中Spring容器对象以org.springframework.web.context.WebApplicationContext.ROOT为key的key-value形式存入到ServletContext.context.attributes属性中。获取filter节点信息创建Filter实例集合保存到ServletContext中获取servlet节点信息创建Servlet实例集合其中的DispatcherServlet就是用来完成SpringMVC容器XmlWebApplicationContext初始化的根据servlet节点中的servlet-class创建相应的Servlet其中DispatcherServlet的初始过程进行SpringMVC容器初始化读取该servlet节点中的SpringMVC配置文件信息将相关Bean加载到SpringMVC容器中设置Spring容器为SpringMVC容器的父容器。当执行SpringMVC容器的getBean方法在自己的context中找不到对应的bean则会在父容器Spring容器的context中找对应的bean。SpringMVC容器初始化完成将容器保存到ServletContext中。SpringMVC容器对象以org.springframework.web.servlet.FrameworkServlet.CONTEXT.xxx其中xxx为servlet-name节点的值为key的key-value形式存入到ServletContext.context.attributes属性中。至此SSM项目启动完成。简单概括初始化过程Web服务器启动加载Web应用创建ServletContext创建Listener完成Spring容器初始化创建Filter创建Servlet完成SpringMVC容器初始化初始化流程图Filter、Servlet等无法自动注入BeanListener、Filter、Servlet无法使用Autowired自动装配bean。并不是因为他们初始化的时候bean还没初始化。而是因为Listener、Filter、Servlet是Web容器管理的而bean是Spring容器或SpringMVC容器管理的。Web容器根部就不认识Autowired注解当然不可能注入成功。