【Spring启动过程分析】(1)启动流程简介

17人阅读 评论(0) 收藏 举报
分类:

1、 spring简介

spring的最基本的功能就是创建对象及管理这些对象之间的依赖关系,实现低耦合、高内聚。还提供像通用日志记录、性能统计、安全控制、异常处理等面向切面的能力,还能帮我们管理最头疼的数据库事务,本身提供了一套简单的JDBC访问实现,提供与 第三方数据访问框架集成(如HibernateJPA),与各种Java EE技术整合(如Java Mail、任务调度等等),提供一套自己的web层框架Spring MVC、而且还能非常简单的与第三方web框架集成。从这里我们可以认为Spring是一个超级粘合平台,除了自己提供功能外,还提供粘合其他技术和框架 的能力,从而使我们可以更自由的选择到底使用什么技术进行开发。而且不管是JAVA SEC/S架构)应用程序还是JAVA EEB/S架构)应用程序都可以使用这个平台进行开发。

 

 

2、 spring运行流程

spring的启动过程其实就是其IoC容器的启动过程,对于web程序,IoC容器启动过程即是建立上下文的过程。

首先看web.xml中的配置:

<servlet>

        <servlet-name>mvc-dispatcher</servlet-name>

        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <load-on-startup>1</load-on-startup>

    </servlet>

 

    <servlet-mapping>

        <servlet-name>mvc-dispatcher</servlet-name>

        <url-pattern>/</url-pattern>

    </servlet-mapping>

 

    <context-param>

        <param-name>contextConfigLocation</param-name>

        <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>

    </context-param>

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

 </listener>

=================分析===========================================

<context-param>

        <param-name>contextConfigLocation</param-name>

        <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>

    </context-param>

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

 </listener>

这段是加载spring配置文件,初始化上下文,ContextLoaderListener是一个实现了ServletContextListener接口的监听器,在启动项目时会触发contextInitialized方法(该方法主要完成ApplicationContext对象的创建),在关闭项目时会触发contextDestroyed方法(该方法会执行ApplicationContext清理操作)

启动项目时触发contextInitialized方法,该方法就做一件事:通过父类contextLoaderinitWebApplicationContext方法创建Spring上下文对象。

initWebApplicationContext方法做了三件事:创建 WebApplicationContext;加载对应的Spring文件创建里面的Bean实例;将WebApplicationContext放入 ServletContext(就是Java Web的全局变量)中。

createWebApplicationContext创建上下文对象,支持用户自定义的 上下文对象,但必须继承自ConfigurableWebApplicationContext,而Spring MVC默认使用ConfigurableWebApplicationContext作为ApplicationContext(它仅仅是一个接口)的实 现。

configureAndRefreshWebApplicationContext方法用 于封装ApplicationContext数据并且初始化所有相关Bean对象。它会从web.xml中读取名为 contextConfigLocation的配置,这就是spring xml数据源设置,然后放到ApplicationContext中,最后调用传说中的refresh方法执行所有Java对象的创建。

完成ApplicationContext创建之后就是将其放入ServletContext中,注意它存储的key值常量。

<servlet>

        <servlet-name>mvc-dispatcher</servlet-name>

        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <load-on-startup>1</load-on-startup>

    </servlet>

 

    <servlet-mapping>

        <servlet-name>mvc-dispatcher</servlet-name>

        <url-pattern>/</url-pattern>

    </servlet-mapping>

这段为启动初始化DispatcherServlet web.xml中设置了Servletload-on-startup表示启动容器时初始化该Servlet

url-pattern表示哪些请求交给Spring Web MVC处理, “/” 是用来定义默认servlet映射的。也可以如“*.html”表示拦截所有以html为扩展名的请求。

DispatcherServlet默认使用WebApplicationContextContextLoaderListener初始化产生)作为上下文,Spring默认配置文件为“/WEB-INF/[servlet名字]-servlet.xml”(该名字可以自定义,在<param-value>)。

===============================注意=======================

DispatcherServlet也可以配置自己的初始化参数,覆盖默认配置,因此我们可以通过添加初始化参数

1

2

3

4

5

6

7

8

9

<servlet>

    <servlet-name>chapter2</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:spring-servlet-config.xml</param-value>

    </init-param>

</servlet>

  

如果使用如上配置,Spring Web MVC框架将加载“classpath:spring-servlet-config.xml”来进行初始化上下文而不是“/WEB-INF/[servlet名字]-servlet.xml”

===========================================================

DispatcherServlet初始化顺序:

1HttpServletBean继承HttpServlet因此在Web容器启动时将调用它的init方法,该初始化方法的主要作用:将Servlet初始化参数(init-param)设置到该组件上(如contextAttributecontextClassnamespacecontextConfigLocation),通过BeanWrapper简化设值过程,方便后续使用;提供给子类初始化扩展点,initServletBean(),该方法由FrameworkServlet覆盖。

2FrameworkServlet继承HttpServletBean通过initServletBean()进行Web上下文初始化,该方法主要覆盖一下两件事情:初始化web上下文;提供给子类初始化扩展点。

3DispatcherServlet继承FrameworkServlet,并实现了onRefresh()方法提供一些前端控制器相关的配置。

整个DispatcherServlet初始化的过程和做了些什么事情,具体主要做了如下两件事情:

1、初始化Spring Web MVC使用的Web上下文,并且指定父容器为WebApplicationContextContextLoaderListener加载了的根上下文);

2、初始化DispatcherServlet使用的策略,如HandlerMappingHandlerAdapter等。

 

So  总体概括spring的启动过程:

1.首先,对于一个web应用,其部署在web容器中,web容器提供其一个全局的上下文环境,这个上下文就是ServletContext,其为后面的spring IoC容器提供宿主环境;

2. 次,在web.xml中会提供有contextLoaderListener。在web容器启动时,会触发容器初始化事件,此时 contextLoaderListener会监听到这个事件,其contextInitialized方法会被调用,在这个方法中,spring会初始 化一个启动上下文,这个上下文被称为根上下文,即WebApplicationContext,这是一个接口类,确切的说,其实际的实现类是 XmlWebApplicationContext。这个就是springIoC容器,其对应的Bean定义的配置由web.xml中的 context-param标签指定。在这个IoC容器初始化完毕后,springWebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE为属性Key,将其存储到ServletContext中,便于获取;

3. 次,contextLoaderListener监听器初始化完毕后,开始初始化web.xml中配置的Servlet,这里是DispatcherServlet,这个servlet实际上是一个标准的前端控制器,用以转发、匹配、处理每个servlet 求。DispatcherServlet上下文在初始化的时候会建立自己的IoC上下文,用以持有spring mvc相关的bean。在建立DispatcherServlet自己的IoC上下文时,会利用WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE 先从ServletContext中获取之前的根上下文(WebApplicationContext)作为自己上下文的parent上下文。有了这个 parent上下文之后,再初始化自己持有的上下文。这个DispatcherServlet初始化自己上下文的工作在其initStrategies 法中可以看到,大概的工作就是初始化处理器映射、视图解析等。这个servlet自己持有的上下文默认实现类也是 mlWebApplicationContext。初始化完毕后,spring以与servlet的名字相关(此处不是简单的以servlet名为 Key,而是通过一些转换,具体可自行查看源码)的属性为属性Key,也将其存到ServletContext中,以便后续使用。这样每个servlet 就持有自己的上下文,即拥有自己独立的bean空间,同时各个servlet共享相同的bean,即根上下文(2步中初始化的上下文)定义的那些 bean

查看评论

内核的启动过程分析-uboot和系统移植第16部分

本课程为linux kernel移植的第3部分,主要内容是linux内核启动流程的代码分析和细节解读。本部分的学习目标是对linux内核的启动和构建过程有个清晰理解,对内核启动后的状态有清晰认识,从而能够帮助我们分析和解决内核移植过程中的问题。
  • 2016年02月25日 22:55

spring 启动过程

spring的启动过程:1.首先,对于一个web应用,其部署在web容器中,web容器提供其一个全局的上下文环境,这个上下文就是ServletContext,其为后面的spring IoC容器提供宿主...
  • disiwei1012
  • disiwei1012
  • 2016-11-06 01:57:24
  • 293

i.mx6 linux启动流程分析.pdf

  • 2015年05月26日 10:35
  • 2.02MB
  • 下载

Android系统启动过程分析

1. 系统启动流程简介 在linux里,每一个进程将有4G的空间,内核将这4G字节的空间分为两部分。最高的1G字节供内核使用,称为“内核空间”。而较低的3G字节供各个进程使用,称为“用户空间”。 ...
  • wh_19910525
  • wh_19910525
  • 2012-04-24 20:47:51
  • 2881

Android系统启动流程(一)解析init进程启动过程

作为“Android框架层”这个大系列中的第一个系列,我们首先要了解的是Android系统启动流程,在这个流程中会涉及到很多重要的知识点,这个系列我们就来一一讲解它们,这一篇我们就来学习init进程。...
  • itachi85
  • itachi85
  • 2017-02-07 11:29:48
  • 13398

X86计算机启动流程分析之BIOS

一、 计算机启动过程 1. 程序被加载器(软件或硬件)加载到内存某个区域。 2. CPU的cs:ip寄存器被指向这个程序的起始地址。   以上是程序载入内存的步骤,操作系统在加载程序时,是加载器将用...
  • hwxlovezy
  • hwxlovezy
  • 2016-12-04 14:56:58
  • 372

第一章 linux系统启动过程分析

最近准备将自己从事linux系统开发以来遇到的问题及总结写成博文分享出来,希望对自己是一个提高,对他人是一个帮助,当然有理解不到位的地方,欢迎指正。&8195;Linux系统从用户打开电源直到屏幕出现...
  • qq_34834193
  • qq_34834193
  • 2016-11-20 00:21:02
  • 427

Spring源码分析2 — 容器启动流程

1 主要类部署web应用时,web容器(比如Tomcat)会读取配置在web.xml中的监听器,从而启动spring容器。有了spring容器之后,我们才能使用spring的IOC AOP等特性。弄清...
  • u013510838
  • u013510838
  • 2017-07-13 15:17:15
  • 1620

Android 7.0系统启动流程分析

简单的分析Android 7.0系统启动流程
  • dd864140130
  • dd864140130
  • 2017-02-27 00:31:06
  • 5401

Android系统启动流程分析之启动应用

继上一篇Android系统启动流程分析之安装应用文章接着分析系统启动应用的过程. Android系统的启动流程简要分析里已经介绍了SystemServer在main方法里创建了一个线程ServerTh...
  • qq_31530015
  • qq_31530015
  • 2016-06-24 17:37:27
  • 1341
    个人资料
    等级:
    访问量: 1193
    积分: 56
    排名: 161万+