Spring MVC 启动过程源码分析详解
今天小编尝试从源码层面上对Spring mvc的初始化过程进行分析,一起揭开Spring mvc的真实面纱,也许我们都已经学会使用spring mvc,或者说对spring mvc的原理在理论上已经能倒背如流。在开始之前,这可能需要你掌握Java EE的一些基本知识,比如说我们要先学会Java EE 的Servlet技术规范,因为Spring mvc框架实现,底层是遵循Servlet规范的。 在开始源码分析之前,我们可能需要一个简单的案例工程,不慌,小编已经安排好了: 样例工程下载地址 : https://github.com/SmallerCoder/spring-mvc-test 那下面就让我们开始吧! 一、前置知识 大家都知道,我们在使用spring mvc时通常会在
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <!-- 上下文参数,在监听器中被使用 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:applicationContext.xml </param-value> </context-param> <!-- 监听器配置 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 前端控制器配置 --> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app> 上面的配置总结起来有几点内容,分别是:DispatcherServlet 当我们将spring mvc应用部署到tomcat时,当你不配置任何的 上面讲了下tomcat加载spring mvc应用的大致流程,接下来将从源码入手分析启动原理。 二、Spring MVC web 上下文启动源码分析 假设现在我们把上面 我们已经知道spring web是基于 public class ContextLoaderListener extends ContextLoader implements ServletContextListener { // 初始化方法 @Override public void contextInitialized(ServletContextEvent event) { initWebApplicationContext(event.getServletContext()); } // 销毁方法 @Override public void contextDestroyed(ServletContextEvent event) { closeWebApplicationContext(event.getServletContext()); ContextCleanupListener.cleanupAttributes(event.getServletContext()); } }
// 创建web上下文,默认是XmlWebApplicationContext if (this.context == null) { this.context = createWebApplicationContext(servletContext); } if (this.context instanceof ConfigurableWebApplicationContext) { ConfigurableWebApplicationContext cwac = (ConfigurableWebApplicationContext) this.context; // 如果该容器还没有刷新过 if (!cwac.isActive()) { if (cwac.getParent() == null) { ApplicationContext parent = loadParentContext(servletContext); cwac.setParent(parent); } // 配置并刷新容器 configureAndRefreshWebApplicationContext(cwac,servletContext); } } 上面的方法只做了两件事: 1、如果spring web容器还没有创建,那么就创建一个全新的spring web容器,并且该容器为root根容器,下面第三节讲到的servlet spring web容器是在此根容器上创建起来的 2、配置并刷新容器 上面代码注释说到默认创建的上下文容器是 我们可以跟进去 复制代码 代码如下: org.springframework.web.context.WebApplicationContext=org.springframework.web.context.support.XmlWebApplicationContext
具体实现为: protected Class<?> determineContextClass(ServletContext servletContext) { // 自定义上下文,否则就默认创建XmlWebApplicationContext String contextClassName = servletContext.getInitParameter(CONTEXT_CLASS_PARAM); if (contextClassName != null) { try { return ClassUtils.forName(contextClassName,ClassUtils.getDefaultClassLoader()); } catch (ClassNotFoundException ex) { throw new ApplicationContextException( "Failed to load custom context class [" + contextClassName + "]",ex); } } else { // 从属性文件中加载类名,也就是org.springframework.web.context.support.XmlWebApplicationContext contextClassName = defaultStrategies.getProperty(WebApplicationContext.class.getName()); try { return ClassUtils.forName(contextClassName,ContextLoader.class.getClassLoader()); } catch (ClassNotFoundException ex) { throw new ApplicationContextException( "Failed to load default context class [" + contextClassName + "]",ex); } } } 上面可以看出其实我们也可以自定义spring web的上下文的,那么怎么去指定我们自定义的上下文呢?答案是通过在 总结: spring mvc启动流程大致就是从一个叫 三、 DispatcherServlet 控制器的初始化 好了,上面我们简单地分析了Spring mvc容器初始化的源码,我们永远不会忘记,我们默认创建的容器类型为
下面我们先看看 看到这我们是不是一目了然了, 因为一个servlet的生命周期是 果不其然, 可以看出方法采用 接着我们跟进 在方法中将会初始化不同于第一小节的web容器,请记住,这个新的spring web 容器是专门为 至此, 总结:
三、每个request调用请求经历了哪些过程 其实说到这才是
接受请求 -----> 是否有各种各样的处理器 上面每一步如果存在相应的组件,当然前提是你在项目中有做相关的配置,则会执行你配置的组件,最后响应请求。因此明白大致的流程之后,如果你想调试一个request,那么你完全可以在 四、后话 本文的工程是基于传统的web.xml加载web项目,当然在spring mvc中我们也可以完全基于注解的方式进行配置,我们可以通过实现 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。 您可能感兴趣的文章:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |