重新学习Spring一--Spring在web项目中的启动过程
1 Spring 在web项目中的启动过程
- Spring简介
- Spring 最简单的功能就是创建对象和管理这些对象间的依赖关系,实现高内聚、低耦合。(高内聚:相关性很强的代码组成,既单一责任原则;低耦合:耦合指块间联系,低耦合既块间联系要低。)
- 还提供像通用日志、性能统计、安全控制、异常处理等面向切面的能力,能帮我们管理最头疼的数据库事务。
- 本身提供了一套简单的JDBC访问实现,提供了与第三方数据访问框架的集成(如Hibernate、JPA、MyBatis),与各种java EE技术整合(如任务调度、java Mail等等),是一个超级粘合平台。
- Spring 的运行流程
- Spring的启动过程其实就是IOC容器的启动过程,对于web程序,IOC容器的启动过程就是建立上下文的过程。
- 启动过程分析:
- 首先,看 web.xml
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-context.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>classpath:spring-context.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
代码分析
这段加载了Spring 的配置文件,初始化上下文。ContextLoaderListener是一个实现了ServletContextListener接口的监听器,在项目启动时触发 contextInitialized 方法(该方法主要完成ApplicationContext对象的创建),在关闭项目时会触发 contextDestroyed 方法(该方法会执行ApplicationContext的清理操作)
- 启动项目时触发contextInitialized 方法,该方法就做一件事,通过父类contextLoader的initWebApplicationContext 方法创建Spring上下文对象(ApplicationContext对象);
- initWebApplicationContext 方法做了三件事:
- 创建WebApplicationContext;
- 加载对应的Spring文件创建的Bean实例;
- 讲WebApplicationContext放入ServletContext(既javaweb的全局变量中)。
- createWebApplicationContext 创建上下文对象,支持用户自定义的上下文对象,但必须继承自ConfigurableWebApplicationContext,而Spring MVC默认使用 ConfigurableWebApplicationContext 作为 ApplicationContext(它是一个接口)的实现。
- configureAndRefreshWebApplicationContext 方法用于封装Application数据并且初始化所有相关的Bean对象。它会从web.xml中读取名为 contextConfigLocation 的配置,这就是 Spring xml 数据源的设置,然后放到ApplicationContext中,最后调用传说中的 refresh 方法执行所有java对象的创建。
- 完成ApplicationContext创建之后就是将其放入ServletContext中,注意它存储的key值常量。
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
代码分析
这段为启动初始化DispatcherServlet,web.xml中设置了Servlet的load-on-startup:表示启动容器时初始化该Servlet。
- url-pattern: 表示哪些请求交给Spring Web MVC 处理,“/”是用来定义默认servlet映射的。也可以如“*.html”表示拦截所有以html为扩展名的请求。
- DispatcherServlet 默认使用WebApplicationContext(ContextLoaderListener初始化产生)作为上下文,Spring默认文件为“/WEB-INF/servlet名字-servlet.xml”(该名字可以自定义,在
<param-value>中)- 注意:DispatcherServlet 也可以配置自己的初始化参数,覆盖默认配置,因此我们可以通过添加初始化参数。通过下面例子Spring Web MVC框架将会加载“classpath:spring-servlet-config.xml” 而不是”/WEB-INF/servlet名字-servlet.xml”
<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:spring-servlet-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
DespatcherServlet初始化顺序:
- HttpServletBean 继承 HTTPServlet , 因此在Web容器启动时将调用它的init方法,该初始化方法的主要作用:将Servlet初始化参数(init-param)设置到该组件上(如contextAttribute、contextClass、namespace、contextConfigLocation),通过BeanWrapper简化设置过程,方便后续使用;提供给子类初始化扩展点,initServletBean(),该方法由 FrameworkServlet 覆盖。
- FrameworkServlet 继承 HttpServletBean,通过initServletBean()进行Web上下文初始化,该方法主要覆盖以下两件事情:初始化web上下文;提供子类初始化扩展点。
- DispatcherServlet 继承 FrameworkServlet,并实现了 onRefresh()方法提供一些前段控制器相关的配置。
那么整个 DispatcherServlet 初始化做了些什么? 两件事:
- 初始化Spring Web MVC 使用的Web上下文,并且制定容器为 WebApplicationContext (ContextLoaderListener 加载了的根上下文);
- 初始化 DispatchServlet 使用的策略,如HandlerMapping、HandlerAdapter等。
总结概括Spring的启动过程:
- 首先,对于一个web应用,其部署在web容器中,web容器提供其一个全局的上下文环境,这个上下文就是ServletContext,其为后面的Spring IOC 容器提供宿主环境,Spring的启动过程,实际上就是SpringIOC容器的启动过程;
- 其次,在web.xml中会提供一个contextLoaderListener,在这里会初始化一个根上下文,既Spring IOC容器。在web容器启动时,会触发容器初始化时间,此时contextLoaderListener 会监听到这个事件,其contextInitialized 方法会被调用,在这个方法中,Spring 会初始化一个启动上下文,叫根上下文,既WebApplicationContext,这是一个接口,实际上是XMLWebApplicationContext。这个就是Spring的IOC容器。初始化完毕后,Spring会以一个key得形式将其存储到ServletContext中,便于获取。
- 再次,contextLoaderListener 监听器初始化完毕后,开始初始化web.xml中配置的Servlet,这里是DispatcherServlet,这个servlet实际上是一个标准的前段控制器,用以转发、匹配、处理每个servlet请求。DispatcherServlet 上下文在初始化的时候会建立自己的IOC上下文,用以持有Spring MVC相关的bean。在建立DispatcherServlet自己的IOC上下文时,会先从key中获取到之前的根上下文(既WebApplicationContext)作为自己上下文的parent上下文。有了这个parent上下文,在初始化自己持有的上下文。他初始化自己的上下文在其initStrategies 方法中可以看到,大概的工作就是初始化处理映射、视图解析等,其默认实现类也是XMLWebApplicationContext。
重新学习Spring一--Spring在web项目中的启动过程的更多相关文章
- Spring学习(四)在Web项目中实例化IOC容器
1.前言 前面我们讲到Spring在普通JAVA项目中的一些使用.本文将介绍在普通的Web项目中如何实例化Spring IOC容器.按照一般的思路.如果在Web中实例化Ioc容器.这不得获取Conte ...
- Spring 在web 容器中的启动过程
1.对于一个web 应用,其部署在web 容器中,web 容器提供其一个全局的上下文环境,这个上下文就是 ServletContext ,其后面的spring IoC 容器提供宿主环境 2.在web. ...
- web项目中加入struts2、spring的支持,并整合两者
Web项目中加入struts2 的支持 在lib下加入strut2的jar包 2. 在web.xml中添加配置 <filter> <filter-name>struts2< ...
- Spring在Web项目中的三种启动加载的配置
在最近的项目中,使用到了spring相关的很多东西,有点把spring的配置给搞混了,从网上查到的资料以及整理了一下. 在Web项目中,启动spring容器的方式有三种,ContextLoaderLi ...
- Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问
本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这 ...
- 在普通WEB项目中使用Spring
Spring是一个对象容器,帮助我们管理项目中的对象,那么在web项目中哪些对象应该交给Spring管理呢? 项目中涉及的对象 我们回顾一下WEB项目中涉及的对象 Servlet Request ...
- Spring mvc创建的web项目,如何获知其web的项目名称,访问具体的链接地址?
Spring mvc创建的web项目,如何获知其web的项目名称,访问具体的链接地址? 访问URL: http://localhost:8090/firstapp/login 在eclipse集成的 ...
- web项目中 集合Spring&使用junit4测试Spring
web项目中 集合Spring 问题: 如果将 ApplicationContext applicationContext = new ClassPathXmlApplicationContext(& ...
- 06_在web项目中集成Spring
在web项目中集成Spring 一.使用Servlet进行集成测试 1.直接在Servlet 加载Spring 配置文件 ApplicationContext applicationContext = ...
随机推荐
- nginx 日志打印响应时间 request_time 和 upstream_response_time
设置log_format,添加request_time,$upstream_response_time,位置随意 og_format main '"$request_time" ...
- php 对接微信接口 {"errcode":41001,"errmsg":"access_token missing hint
这里是针对所有token微信都有这种机制 1.token被多次访问无效 访问微信接口->得到token,缓存起来2小时内有效,期间2小时内每次都取缓存即可,不必每次都去微信那边兑换 问题:缓存期 ...
- 工具系列 | 使用FormData方式上传文件
服务端代码 /** * 文件上传 */ public function uploadFile() { Log::error('文件上传 : '.json_encode($_FILES)); $dir ...
- Centos 7.x卸载ibus黑屏修复及fcitx搜狗拼音安装方法
ibus黑屏修复 百度出来的fcitx安装方法,都要卸载ibus,如果没有注意同时卸载掉的依赖包的话,gnome桌面中的一些关键库也没被卸载. 修复方法很简单,重新安装Gnome sudo yum - ...
- 本地快速搭建MarkDown语法网站
主要是在之前跟人学的快速搭建一个简单的网站,可以通过这样的方式把相关的文档美美的放在服务器上,然后给别人看也好,自己也能熟系熟系MarkDown的语法并学习,要是接口文档还是推荐通过swagger去实 ...
- odoo开发笔记 -- 单台物理服务器上,利用docker部署多套odoo应用
部署结构: 待更新! ----服务器硬件配置: 操作系统:ubuntu16.04-64bit CPU/内存:4核8G 1. 基础环境安装 nginx离线安装: docker环境安装: 2. 官方容器镜 ...
- Django入门2开发工具pycharm的配置
在pycharm中新建django项目 查看django是否安装成功 运行django 设置pycharm快捷键 设置python模板,新建的python文件就会自动生成一些信息 设置django启动 ...
- matlab学习笔记11_3高维数组操作 filp, shiftdim, size, permute, ipermute
一起来学matlab-matlab学习笔记11 11_3 高维数组处理和运算 filp, shiftdim, size, permute, ipermute 觉得有用的话,欢迎一起讨论相互学习~Fol ...
- 转 Oracle 同一个字段的两值进行加减计算
https://www.cnblogs.com/hjianguo/p/6041617.html 如 病人ID 入院日期 出院日期 00001 2016 ...
- 【452】pandas筛选出表中满足另一个表所有条件的数据
参考:pandas筛选出表中满足另一个表所有条件的数据 参考:pandas:匹配两个dataframe 使用 pd.merge 来实现 on 表示查询的 columns,如果都有 id,那么这是很好的 ...