转载

【聊透SpringMVC】SpringMVC“传统”方式的启动过程

打成 war包

并放入Tomcat等Servlet容器下面运行的,都认为是SpringMVC传统的启动方式。

和SpringBoot连用且采用内嵌Web服务器并打成

jar包 直接运行的,可以认为是SpringMVC现代的启动方式。

传统的启动过程

基于web.xml(配置文件)的方式启动肯定算传统的,但由于现在web.xml几乎已经绝迹,所以就不考虑它了。

与之相对的就是基于编程(写代码)的方式启动,流行于前几年的

SSM

(Spring、SpringMVC、MyBatis)中。当然也算传统的。

在上一篇中讲到,通过一个“

小桥式 ”的接口 ServletContainerInitializer

(Servlet容器初始化器)把Tomcat的启动和初始化进程带到了SpringMVC里。

在这个“桥式”接口上可以指定“感兴趣”的类或接口,SpringMVC指定的是

WebApplicationInitializer

(Web应用初始化器)接口,意图已经很明显,就是通过这个初始化器接口来完成SpringMVC应用的启动和初始化。

我们先来看下这个初始化接口,如下图01:

【聊透SpringMVC】SpringMVC“传统”方式的启动过程

它只有一个 onStartup 方法,方法只有一个参数就是 ServletContext

,这个ServletContext由Tomcat创建好后提供给SpringMVC,SpringMVC在启动过程中调用这个onStartup方法,在这个方法内完成自身的创建和初始化,还要把Servlet和Filter等注册到ServletContext里。

这些工作都是SpringMVC要做的,而不是我们要做的,所以SpringMVC肯定已经实现了这个接口,我们查看下类型信息,如下图02:

【聊透SpringMVC】SpringMVC“传统”方式的启动过程

我们发现了一个看着很重要的类,就是:

AbstractAnnotationConfigDispatcherServletInitializer

可惜这个类是抽象的,肯定是不能直接用的,但是它里面已经包含了刚刚上面提到的所有完整的启动逻辑过程。

如果你对SSM很熟悉或Spring的

官方文档

看的很熟悉的话,你一定知道这个类是怎么用的。是的,我们需要定义一个类来继承它即可。

先看下官方文档上给的用法,如下图03:

【聊透SpringMVC】SpringMVC“传统”方式的启动过程

继承之后,我们需要提供三方面信息,一个是用于注册到根容器中的类,一个是用于注册到Servlet容器中的类,一个是核心Servlet的映射URL。

注意,这里说的容器指的是Spring的ApplicationContext这个容器,其中根容器和Servlet容器是父子关系,且在SpringMVC中核心Servlet映射的URL必须是“/”。

下面给出一个我在几年前为公司搭建框架时的代码,如下图04:

【聊透SpringMVC】SpringMVC“传统”方式的启动过程

这就是以编程的方式来完成SpringMVC的启动。我们自己定义的这个类就是前文提到的“ 感兴趣

”的类。

这个类是

不用 (或不能) 向Spring容器注册 的,因为这个类是感兴趣的类,所以 Tomcat会从jar包里把它找出来

,这样SpringMVC就拿到了我们定义的这个类。

其实最主要的是这时候根本还没有Spring容器呢,哈哈,因为Spring容器就是在这个类里才创建出来的,有点意思吧。

其实这个类里包含的内容非常多,我们都可以使用写代码的方式来进行配置。下面举几个示例。

比如对

核心Servlet 的一些定制化设置,如下图05:

【聊透SpringMVC】SpringMVC“传统”方式的启动过程

比如可以加进去一些自己需要的 过滤器 ,如下图06:

【聊透SpringMVC】SpringMVC“传统”方式的启动过程

比如可以对 文件上传 进行一些配置,如下图07:

【聊透SpringMVC】SpringMVC“传统”方式的启动过程

当然,还可以介入到 Spring容器的初始化 过程中,进行一些额外的操作,如激活特定的Profile等,如下图08:

【聊透SpringMVC】SpringMVC“传统”方式的启动过程

启动过程中做的事情

其实前面已经说了一些了,这里再来个完整版的,主要包括的事情有:

1、

创建根容器。

2、

然后把根容器放入ServletContext中。

3、

接着创建Servlet容器。

4、

然后使用Servlet容器去创建核心Servlet。

5、

接着把核心Servlet注册到ServletContext中。

6、

接着再注册一些过滤器。

下面我们使用几张图把这些内容一个个展示一下,需要详细了解的可以去看看对应的源码。

创建根容器,可以看到是基于注解的容器类,如下图09:

【聊透SpringMVC】SpringMVC“传统”方式的启动过程

将根容器放入ServletContext中,因为ServletContext在应用运行期间一直存在,所以根容器是一个全局性的,也一直存在,如下图10:

【聊透SpringMVC】SpringMVC“传统”方式的启动过程

创建Servlet容器,容器类也是基于注解的,和根容器类是一样的,如下图11:

【聊透SpringMVC】SpringMVC“传统”方式的启动过程

使用Servlet容器去创建核心Servlet,如下图12:

【聊透SpringMVC】SpringMVC“传统”方式的启动过程

把核心Servlet注册到ServletContext中,如下图13:

【聊透SpringMVC】SpringMVC“传统”方式的启动过程

最后就是注册一些过滤器了,如下图14:

【聊透SpringMVC】SpringMVC“传统”方式的启动过程

号主提示: 建议做Java开发且渴望优秀的朋友一定要把这些东西搞清楚

(END)

作者现任架构师,工作 11 年,Java技术栈,计算机基础,用心写文章,喜欢研究技术, 崇尚简单快乐。 追求以通俗易懂的语言解说技术,希望所有的读者都能看懂并记住。

【聊透SpringMVC】SpringMVC“传统”方式的启动过程

>>> 热门文章集锦 <<<

毕业10年,我有话说

我是一个协程

我是一个跳表

线程池开门营业招聘开发人员的一天

递归 —— 你值得拥有

迄今为止最好理解的ZooKeeper入门文章

基于角色的访问控制(RBAC)

11年码农的肺腑之言,如何成为一个优秀的程序员,送给渴望优秀的人

非著名架构师告诉你,代码该如何写,才能自己写的容易别人看的也不痛苦

迄今为止最硬核的「Java8时间系统」设计原理与使用方法

任何人都需要知道的「世界时间系统」构成原理,尤其开发人员

彻彻底底给你讲明白啥是SpringMvc异步处理

【面试】我是如何面试别人List相关知识的,深度有点长文

我是如何在毕业不久只用1年就升为开发组长的

爸爸又给Spring MVC生了个弟弟叫Spring WebFlux

【面试】我是如何在面试别人Spring事务时“套路”对方的

【面试】Spring事务面试考点吐血整理(建议珍藏)

【面试】吃透了这些Redis知识点,面试官一定觉得你很NB(干货 | 建议珍藏)

【面试】如果你这样回答“什么是线程安全”,面试官都会对你刮目相看(建议珍藏)

【面试】迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏)

【面试】一篇文章帮你彻底搞清楚“I/O多路复用”和“异步I/O”的前世今生(深度好文,建议珍藏)

【面试】如果把线程当作一个人来对待,所有问题都瞬间明白了

Java多线程通关———基础知识挑战

品Spring:帝国的基石

原文  http://mp.weixin.qq.com/s?__biz=MzIyNjAzODEyMg==&mid=2247484834&idx=1&sn=cd445099f319cfea4756647cc5da906b
正文到此结束
Loading...