springboot需要tomcat服务器吗_SpringBoot学习(二):内嵌服务器引擎(Tomcat,Jetty)实现原理...

概述

  • SpringBoot使用main方法启动的一个重要特性是,不需要打包成war部署到Tomcat这种Servlet容器中,而是只需打包成jar,然后通过java或mvn等命令运行这个jar包,然后应用就可以在指定的端口监听客户端的连接请求了。
  • 在SpringBoot内部主要是引用了embedded的Tomcat或Jetty等作为Servlet引擎,由该Servlet引擎负责接收Web请求并交给应用处理和生成响应,从而可以将应用打包成jar,直接在命令行启动,以独立进程的方式运行,无需依赖Tomcat等Servlet容器,但是可以实现跟部署到Tomcat中的war包一样处理Web请求和响应。

接口设计

  • 在接口设计层面,对Spring容器而言,是通过拓展ApplicationContext接口来增加Spring容器对Servlet引擎的支持;对Servlet引擎而言,则是定义了WebServer接口来代表Servlet引擎或者说是Web服务器,WebServer接口实现类为具体的Servlet引擎实现。
  • Spring容器通过包含WebServer的引用来负责Servlet引擎的启动关闭。同时与普通Servlet容器实现(如Tomcat)一样,将Spring应用通过关联一个ServletContext引用来建立与Servlet引擎的关联,同时将自身保存为ServletContext引用的attribute。
  • 应用自身在启动的时候,会创建和启动Spring容器,在Spring容器中通过该WebServer引用来启动对应的Servlet引擎。并在启动Servlet引擎过程中,创建该应用对应的ServletContext,由该ServletContext来间接建立当前应用与Servlet引擎的关联。

Spring容器ApplicationContext体系

  • WebServerApplicationContext接口:定义获取WebServer引用的方法
53e56a1d4a41d4e5159b520597843bd6.png
  • ServletWebServerApplicationContext:WebServerApplicationContext接口的具体实现类,包含WebServer的引用,类定义如下:
dcd079c8825c4f769765c52c273f4f32.png
  • 由继承体系可知,继承了GenericWebApplicationContext,在GenericWebApplicationContext中定义了ServletContext引用。
  • 由代码注释可知,Spring容器管理了一个ServletWebServerFactory引用,ServletWebServerFactory为WebServer实现类对象的工厂类,通过ServletWebServerFactory来创建servlet引擎WebServer,其中由ServletWebServerFactory创建的WebServer默认在8080端口监听请求,具体为在基类AbstractConfigurableWebServerFactory中定义。
  • 同时注册到Spring容器的Servlet,Filter接口的实现类会自动注册到Servlet引擎,具体为应用对应的ServletContext。
  • AnnotationConfigServletWebServerApplicationContext:基于注解的Spring容器,继承了ServletWebServerApplicationContext。
  • XmlServletWebServerApplicationContext:基于XML的Spring容器,继承了ServletWebServerApplicationContext。

Servlet引擎体系

  • WebServer接口:声明Servlet引擎启动,关闭的方法,相应的实现类实现这些方法来定义启动和关闭逻辑,而对Spring容器ServletWebServerApplicationContext而言,只需依赖这个接口即可,不依赖具体实现,这也是遵循了依赖倒置设计原则。
3f9f60ff71b7f25cabab4e122435fc08.png
  • ServletWebServerFactory接口:Servlet引擎WebServer的工厂接口,接口定义如下,声明了getWebServer方法。也是遵循依赖倒置设计原则,即Spring容器ServletWebServerApplicationContext只依赖这个接口,具体为这个接口的getWebServer方法来获取一个Servlet引擎WebServer对象,而该接口的具体实现类,负责实现这个接口。实现类包括:TomcatServletWebServerFactory,JettyServletWebServerFactory,UndertowServletWebServerFactory,具体在embedded包定义。
de77d8f3b0d6d9c14d89c47a352770a2.png

Spring容器和Servlet引擎启动过程

  • Spring容器是在ApplicationContext的refresh方法定义启动流程的,具体为在AbstractApplicationContext中定义refresh方法的流程模板:关于Servlet引擎的启动,是在onRefresh和finishRefresh方法定义的,由onRefresh方法的注释可知,这个方法是设计用来注册有特殊功能的bean对象到Spring容器内部的BeanFactory的。所以Spring容器的设计拓展性是很好的。
f0efb629181e7e56c4e069589a2f3a73.png
  • ServletWebServerApplicationContext的refresh方法,onRefresh方法,finishRefresh方法。其中onRefresh方法负责Server引擎和ServletContext的创建;finishOnRefresh方法负责Servlet引擎的启动,即调用WebServer的start方法,然后在指定的端口,如8080,监听客户端的请求。
c14dead4b42a93dd50497678dd1eb0a1.png
  • createWebServer方法实现:创建servlet引擎WebServer和ServletContext。
0e567c0e6c3c265b75711123e6305700.png
  • startWebServer方法实现:调用Servlet引擎的start方法完成启动。
e4b089201d63d33c088b07aff57faeee.png
  • 以下为TomcatWebServer的start方法实现:启动应用在Servlet规范中对应的Context,即TomcatEmbeddedContext
e3159b1d250bb2cc872e75b5b9b2151d.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337591.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java8 函数式编程_使用Javaslang进行Java 8中的函数式编程

java8 函数式编程我们非常高兴地在jOOQ博客上宣布一个客座帖子,该帖子由HSH Nordbank的高级软件工程师Daniel Dietrich (三人的丈夫和父亲)撰写。 他目前作为项目负责人和首席开发人员为金融产品创建定价框架。 除工作外,他还对编…

while(1) 和 for(;;)有什么区别?

点击蓝字关注我们有粉丝问了类似这样的问题:while(1) 和 for(;;)它们不都是无限循环吗,作用应该一样啊,它们到底有什么区别?要回答这个问题,其实你各自编写一段while(1) 和 for(;;)的代码,编译对比一下代码…

C++高阶必会操作--模板元编程

点击蓝字关注我们泛型编程大家应该都很熟悉了,主要就是利用模板实现“安全的宏”,而模板元编程区别于我们所知道的泛型编程,它是一种较为复杂的模板,属于C的高阶操作了,它最主要的优点就在于把计算过程提前到编译期&am…

怎样做远程计算机控制系统,qq远程控制,怎样进行远程控制制作步骤

怎样设置qq远程控制?qq上有一个远程协助不少人都用过,但是这个远程小编建议不是认识的朋友,不要随便开放,很容易被窃取电脑资料,如果是不是很信得过有人,在申请协助时一定要自己盯着电脑,以防别…

pcl中ransac提取直线_复杂场景中的一个图像配准思路

在很多时候,我们可能需要使用到图像的识别与配准工作,来判断某个特征或者是划出某个特定特征的位置。现在的深度学习已经能够比较好地解决这个问题,比如常见的YOLO,可以利用几行设定代码就能够划出所需要识别的位置。但是精准度可…

程序员必知的10个C语言技巧

点击蓝字关注我们硬件设计师最常见的工作内容,就是通过写代码来测试硬件。这10个C语言技巧(C语言仍然是常见的选择)可以帮助设计师避免因基础性错误而导致某些缺陷的产生,并造成维护方面的困扰。为了成功的推出一个产品&#xff0…

一万字详解C语言中长度为零的数组

点击蓝字关注我们零长度数组概念:众所周知, GNU/GCC 在标准的 C/C 基础上做了有实用性的扩展, 零长度数组(Arrays of Length Zero) 就是其中一个知名的扩展.多数情况下, 其应用在变长数组中, 其定义如下:struct Packet {int state…

app访问java web_Java Web App体系结构

app访问java web我曾经利用Servlet,JSP,JAX-RS,Spring框架,Play框架,带有Facelets的JSF和一些Spark框架。 以我的拙见,所有这些解决方案都远非面向对象和优雅的。 它们都充满了静态方法,不可测试…

电路中滤波电容和退耦电容_详解电源滤波电路中的高频滤波电容电路

图2-12所示是电源滤波电路中的高频滤波电路。电路中,一个容量很大的电解电容C1(2200F)与一个容量很小的电容C2(0.01F)并联,C2是高频滤波电容,用来进行高频成分的滤波,这种一大一小两个电容相并联的电路在电源电路中十分常见。1.高…

计算机驱动空间不够,Win8.1系统如何释放驱动器空间解决可用空间不足问题

现在越来越多用户安装升级win8.1系统,在操作使用过程中难免遇到一些奇奇怪怪的问题。相信有很多win8.1系统用户会遇到电脑的可用空间不足的提示,用户感到很疑惑,自己的电脑又没装什么软件怎么会这么提示。有什么办法可以解决此问题&#xff0…

C/C++ 中公认的三个难点

点击蓝字关注我们C语言在嵌入式学习中是必备的知识,审核大部分操作都要围绕C语言进行,而其中有三块“难啃的硬骨头”几乎是公认级别的。0x01 指针指针公认最难理解的概念,也是让很多初学者选择放弃的直接原因。指针之所以难理解,因…

python 字符串分割_如何使用python语言split方法对不同字符串分割

在JavaScript中,可以使用split()将字符串分割成字符串数组;而在python语言中,split()方法也可以将字符串进行分割,分割之后的结果放置在列表中。下面利用几个实例说明split()方法的用法,操作如下:工具/原料…

java 拼图_功能项目拼图将Java 9引入

java 拼图因此,拼图项目...我们已经对此颇为了解,但尚未看到计划如何兑现其承诺的细节。 这篇文章将精确地做到这一点,并介绍项目的核心概念和功能。 系列 这篇文章是正在进行的有关拼图项目系列的一部分。 按照推荐的顺序(不同于…

win7 蓝牙4.0 ble驱动_初识物联网无线通信技术之蓝牙4.0BLE协议栈

[本文属原创,转载请附上原文出处链接。]一、需要的软件工具1、BLE协议栈(BLE-CC254x-1.4.0)2、IAR开发软件(IAR Embedded Workbench8.20.2)注:1.4.0协议栈使用8.20.2的iar版本,1.3.2协议栈等使用的是8.10.4的iar版本。二、BLE协议栈安装目录下…

C语言:谈谈指针!

点击蓝字关注我们指针对于C来说太重要。然而,想要全面理解指针,除了要对C语言有熟练的掌握外,还要有计算机硬件以及操作系统等方方面面的基本知识。所以本文尽可能的通过一篇文章完全讲解指针。为什么需要指针?指针解决了一些编程…

C/C++ 中的 #pragma once 作用是什么?

点击蓝字关注我们1、#pragma once有什么作用?为了避免同一个头文件被包含(include)多次,C/C中有两种宏实现方式:一种是#ifndef方式;另一种是#pragma once方式。在能够支持这两种方式的编译器上,…

python做大数据的框架_Python+大数据计算平台,PyODPS架构手把手教你搭建

原文链接:http://click.aliyun.com/m/13965/ 在2016年10月的云栖社区在线培训上,来自阿里云大数据事业部的秦续业分享了《双剑合壁——Python和大数据计算平台的结合实战》。他主要介绍了数据分析和机器学习的方法、DataFrame整体架构以及基础API、前端、…

武魂觉醒s系列服务器,[多线]星河斗罗——新服开荒丨高程度剧情还原丨3D坐骑丨魂环丨武魂觉醒[1.12.2]...

[服务器介绍]星河斗罗 全新原创开荒斗罗大陆服务器前言:超高还原小说真实性,独特的武魂贴图,魂兽建模,坐骑建模,开放性冒险地图,让您更加体验斗罗大陆的真实性。进服送新手大礼包:装备&#xff…

C++ 的万能头文件,你知道多少?

点击蓝字关注我们C 中万能头文件 bits/stdc.h 的介绍很多小伙伴估计看有的代码会碰见没有多余的其它头文件比如 algorithm、cmath、iostream 而是用了一行 #include<bits/stdc.h> 这样的头文件并感到诧异&#xff0c;想这是什么。其实这是一个包含了 C 所有头文件的一个头…

pytorch dataset读取数据流程_高效 PyTorch :如何消除训练瓶颈

加入极市专业CV交流群&#xff0c;与 10000来自港科大、北大、清华、中科院、CMU、腾讯、百度 等名校名企视觉开发者互动交流&#xff01;同时提供每月大咖直播分享、真实项目需求对接、干货资讯汇总&#xff0c;行业技术交流。关注 极市平台 公众号 &#xff0c;回复 加群&…