web.xml中springmvc相关配置如下:
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

首先是tomcat容器启动,然后在容器初始化servlet时,会对DispatcherServlet类进行实例化,进行代码分析,查看DispatchcherServlet的类图如下:

可以看到,DispatcherServlet是符合servlet规范的,可以被tomcat容器作为servlet管理;需要注意的是上述类图中HttpServletBean类中的init()方法,该方法方法体如下图:

该方法是同servlet的生命周期相关的,在后续DispatcherServlet初始化过程中会被调用,其中的bw.setPropertyValues(pvs,true)方法用于将DispatcherServlet中的参数设置到servlet中,便于后续

读取spring的所有配置文件,如下图,但是this.initServletBean才是个重要的调用,因为在此之后才开始进行spring上下文的初始化工作

this.initServletBean最终调用到了FrameworkServlet类中的覆盖方法,在该覆盖方法中首先是创建WebApplicationContext对象,最终,在FrameworkServlet类的createWebApplicationContext方法中

发现创建了一个XmlWebApplicationContext类型的spring上下文对象,关键代码如下图:

需要注意在上下文对象创建之后,会对上下文进行初始化,这个调用是在configureAndRefreshWebApplicationContext(wac)开始的,流程如下图:

由 上图可以看到在对于spring上下文进行一系列的配置之后,最终调用了refresh()方法,开始真正的进行上下文的初始化工作;

因为wac是一个XmlWebApplicationContext对象实例,查看其类图如下:

在调用wac.refresh()方法后,最终进入到AbstractApplicationContext类的refresh方法中进行上下文的初始化,其核心代码如下:

关键部分为beanFactory的创建,这个是用来管理bean的,可谓是相当重要,可以把ApplicationContext作为一个门面,而beanFactory是内核,一个主外,一个主内,对外的部分主要提供

了对于单例bean的访问的各种接口,beanFactory则像勤劳的幕后工作者一样处理bean的注册等等幕后事宜;竖线部分是一个模板流程,使用了模板模式,很多方法只提供了空实现,需要

子类去根据实际需要进行相应的行为,比心的一行比较重要,这块是ApplicationContext和beanFactory进行关联的地方;

在执行ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();之后,最终调用到AbstractRefreshableApplicationContext的refreshBeanFactory方法,其代码如下:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

可以看到,最终创建了DefaultListableBeanFactory实例;在beanFactory创建过程中,首先是判断是否存在,存在则销毁再创建,否则直接创建,圈圈圈住的两行比较重要,其中第一行表示

对于beanFactory进行设定,如允许bean定义覆盖或者循环引用;第二行则是加载bean定义,从配置文件、注解等等地方加载bean,执行该行后,最终调用到XmlWebApplicationContext中

XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);执行后将beanFactory注册到AbstractBeanDefinitionReader
实例中,后续是beanDefinitionReader的一些设置工作,最后一行进行bean定义加载,执行后

首先是获取要读取的文件路径,然后进行遍历读取,最终调用到AbstractBeanDefinitionReader类的loadBeanDefinitions方法中,核心代码如下

首先之前XmlWebApplicationContext反向将自身注册到reader中的资源加载器,然后通过资源加载器加载资源并进行bean的读取

经过一系列的调用,最终在XmlBeanDefinitionReader的doLoadBeanDefinitions方法中真正的进行bean定义加载,如下图:

该方法内部,首先对于xml文件进行加载,然后就是进行解析,注册beanDefinition,如下图:

在执行registerBeanDefinitions之后调用到XmlBeanDefinitionReader的registerBeanDefinitions方法,方法体如下:

其中getRegistry()方法获取了之前注入的DefaultListableDeanFactory,开始方法后

最终调用到DefaultBeanDefinitionDocumentReader的parseBeanDefinitions

其中parseDefaultElement方法用于处理默认的标签,而parseCustomElement用于处理自定义的标签,这块内容感兴趣的话可以研究下那个xml自定义标签的解析,这个在分布式rpc框架等等支持xml文件配置方式的工程中可以见到自定义
标签的解析过程,上图代码部分主要是xml解析,beanDefinition注册,其过程十分类似,在此不再赘述。
整个beanDefinition注册完成后,整个调用回到AbstractRefreshableApplicationContext的refreshBeanFactory中并完成beanFactory和ApplicationContext的关联,即前面我所说的一个主内一个主外,如下图所示:

最终回到AbstractApplicationContext的refresh方法中;

至此,beanFactory获取算是完结了,整个过程是不是一气呵成,是不是很爽,但是这仅仅是模板方法的一部分,下面还有很多,下次再战

在此,总结下整个流程:

首先是tomcat容器启动,实例化servlet,DispatcherServlet被实例化,之后伴随servlet生命周期方法调用,DispatcherServlet的init方法调用,进行ApplicationContext的实例化

和初始化refresh,在初始化的过程中,进行DefaultListableBeanFactory的实例化、初始化、xml解析,beanDefinition的注册,最后BeanFactory注册到Application中,这整个

过程完结,模板方法第一个调用完成,,,

												

web中spring框架启动流程第一发的更多相关文章

  1. Web环境中Spring的启动过程

    1.spring不但可以在JavaSE环境中应用,在Web环境中也可以广泛应用,Spring在web环境中应用时,需要在应用的web.xml文件中添加如下的配置: …… <context-par ...

  2. Spring Boot启动流程分析

    引言 早在15年的时候就开始用spring boot进行开发了,然而一直就只是用用,并没有深入去了解spring boot是以什么原理怎样工作的,说来也惭愧.今天让我们从spring boot启动开始 ...

  3. Spring Boot -- 启动流程分析之ApplicationContext 中

    上一节我们已经分析到AbsractApplicationContext类refresh方法中的postProcessBeanFactory方法,在分析registerBeanPostProcessor ...

  4. Spring Boot(三):Spring Boot中的事件的使用 与Spring Boot启动流程(Event 事件 和 Listeners监听器)

    前言:在讲述内容之前 希望大家对设计模式有所了解 即使你学会了本片的内容 也不知道什么时候去使用 或者为什么要这样去用 观察者模式: 观察者模式是一种对象行为模式.它定义对象间的一种一对多的依赖关系, ...

  5. Spring MVC启动流程分析

    本文是Spring MVC系列博客的第一篇,后续会汇总成贴子. Spring MVC是Spring系列框架中使用频率最高的部分.不管是Spring Boot还是传统的Spring项目,只要是Web项目 ...

  6. Spring Boot启动流程详解(一)

    环境 本文基于Spring Boot版本1.3.3, 使用了spring-boot-starter-web. 配置完成后,编写了代码如下: @SpringBootApplication public ...

  7. [Abp vNext 源码分析] - 1. 框架启动流程分析

    一.简要说明 本篇文章主要剖析与讲解 Abp vNext 在 Web API 项目下的启动流程,让大家了解整个 Abp vNext 框架是如何运作的.总的来说 ,Abp vNext 比起 ABP 框架 ...

  8. Spring Boot启动流程

    基础准备 1,BeanPostProcessor:这个接口的作用在于对于新构造的实例可以做一些自定义的修改.比如如何构造.属性值的修改.构造器的选择等等 2,BeanFactoryPostProces ...

  9. Spring Boot启动流程详解

    注:本文转自http://zhaox.github.io/java/2016/03/22/spring-boot-start-flow 环境 本文基于Spring Boot版本1.3.3, 使用了sp ...

随机推荐

  1. Kali linux2.0里Metasploit的postgresql selected, no connection问题解决

    说在前面的话 1.在kali中metasploit默认使用postgresql作为它的数据库: 想要开启metasploit服务首先得打开postgresql数据库, 命令如下:(或者:/etc/in ...

  2. SQL反模式学习笔记14 关于Null值的使用

    目标:辨别并使用Null值 反模式:将Null值作为普通的值,反之亦然 1.在表达式中使用Null: Null值与空字符串是不一样的,Null值参与任何的加.减.乘.除等其他运算,结果都是Null: ...

  3. ssl证书专题(3):创建CA和申请证书

    请看:  https://www.cnblogs.com/mingzhang/p/8949541.html

  4. ajax的xmlHttpRequest异步请求和Springmvc的sendRedirect失效问题

    参考: Ext 提交表单用的异步提交Ajax.Ajax在发送请求时后台返回的数据(json或者html页面)在其回调函数中处理.  你这个相当于后台把Center_right.jsp页面已经返回给前台 ...

  5. Service的启动过程

    --摘自<Android进阶解密> 第一步:ContextImpl到ActivityManagerService的调用过程 第二步:ActivityThread启动Service 1)Pr ...

  6. POJ 3280 Cheapest Palindrome (区间DP) 经典

    <题目链接> 题目大意: 一个由小写字母组成的字符串,给出字符的种类,以及字符串的长度,再给出添加每个字符和删除每个字符的代价,问你要使这个字符串变成回文串的最小代价. 解题分析: 一道区 ...

  7. [Sublime]Sublime安装以及插件使用

    安装直接去官网下载安装了 安装Package Control关于安装Package Control,有两种方法. 一.自动安装 自动安装很方便,网上代码很多.我用的是Sublime Text3,通过V ...

  8. 译:Dataiku 白皮书之《在银行和保险行业应用数据科学》

    原文链接:Data Science For Banking & Insurance 如果不能正常访问,请点击备份获取. 在银行和保险行业应用数据科学 互联网巨头和金融技术创业时代的求生和发展 ...

  9. FLASK 的Session和MoudelForm插件

    falsk是小而精的框架,但是热度高, 所有很多爱好者提供了很多扩展插件 功能强大,美而不足的就是兼容稳定性有时候不太好,不过大部分还是很可以的 Flask-Session flask内置sessio ...

  10. 在Linux下用gcc编译hello world

    1. 确保Linux系统里已经装好了gcc 测试:输入gcc后是如下的结果就说明已经安装成功 2. 创建HelloWorld.c 使用 touch 创建一个空文件; 用vim编辑 按下A或者I 插入 ...