当前位置:首页 > 科技  > 软件

Spring Boot 内嵌 Web 容器启动原理,惊爆你的眼球!

来源: 责编: 时间:2024-05-17 17:46:49 298观看
导读一、spring boot内嵌web容器介绍Spring Boot 支持以下内嵌的 Web 容器:Tomcat:Spring Boot 默认使用的 Web 容器,也是最常用的选择。Tomcat 是一个流行的开源 Servlet 容器,具有广泛的应用和良好的性能。Jetty:另一个常用

一、spring boot内嵌web容器介绍

Spring Boot 支持以下内嵌的 Web 容器:SLU28资讯网——每日最新资讯28at.com

  1. Tomcat:Spring Boot 默认使用的 Web 容器,也是最常用的选择。Tomcat 是一个流行的开源 Servlet 容器,具有广泛的应用和良好的性能。
  2. Jetty:另一个常用的 Web 容器,它具有轻量级和高效的特点。Spring Boot 也提供了对 Jetty 的支持。
  3. Undertow:一个高性能的 Web 容器,特别适合处理高并发和大规模的应用。Spring Boot 也可以与 Undertow 集成。

这些内嵌的 Web 容器都可以在 Spring Boot 应用中直接使用,无需额外的安装和配置。Spring Boot 会自动根据项目的依赖和配置来选择合适的 Web 容器,并进行相应的配置和启动。SLU28资讯网——每日最新资讯28at.com

你可以根据项目的需求和特点选择适合的 Web 容器。例如,如果对性能有较高要求,可以考虑使用 Undertow;如果需要与现有 Tomcat 环境集成,则可以选择 Tomcat。SLU28资讯网——每日最新资讯28at.com

二、如何切换spring boot内嵌web容器

以jetty为例,我们只需要将默认的tomcat依赖排除,并将jetty依赖引入,即可完成内嵌web容器的切换。SLU28资讯网——每日最新资讯28at.com

<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-web</artifactId>    <!--1、移除tomcat依赖(exclusions:排除)-->    <exclusions>        <exclusion>            <artifactId>spring-boot-starter-tomcat</artifactId>            <groupId>org.springframework.boot</groupId>        </exclusion>    </exclusions></dependency><!--2、加入jetty依赖--><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-jetty</artifactId></dependency>

启动项目,我们可以看到,jetty确实启动了。SLU28资讯网——每日最新资讯28at.com

SLU28资讯网——每日最新资讯28at.com

SLU28资讯网——每日最新资讯28at.com

三、spring boot内嵌web容器启动原理

Spring Boot 内嵌 Web 容器的启动原理可以概括为以下几个步骤:SLU28资讯网——每日最新资讯28at.com

  1. 依赖注入:Spring Boot 在启动时,会自动扫描项目中的依赖,并将相关的 Web 容器依赖注入到应用程序中。
  2. 容器初始化:Spring Boot 会根据配置文件或默认设置,初始化所选的内嵌 Web 容器。这包括创建容器实例、设置端口号、上下文路径等。
  3. 组件扫描和注册:Spring Boot 会扫描项目中的组件(如控制器、服务等),并将它们注册到 Web 容器中,以便处理 HTTP 请求。
  4. 配置加载:Spring Boot 会加载应用程序的配置信息,包括端口号、上下文路径、静态资源路径等,并将这些配置应用到 Web 容器中。
  5. 启动容器:一旦容器初始化完成并配置好,Spring Boot 会启动内嵌的 Web 容器,使其开始监听指定的端口,并准备处理 HTTP 请求。
  6. 应用程序运行:此时,应用程序已经在所选的内嵌 Web 容器中运行,可以通过访问指定的端口来访问应用程序的功能。

相关源码如下:SLU28资讯网——每日最新资讯28at.com

SpringApplication类createApplicationContext方法,根据当前web应用的类型选择匹配的应用上下文类型,这边会创建AnnotationConfigServletWebServerApplicationContext。SLU28资讯网——每日最新资讯28at.com

protected ConfigurableApplicationContext createApplicationContext() {		Class<?> contextClass = this.applicationContextClass;		if (contextClass == null) {			try {				switch (this.webApplicationType) {				case SERVLET:					contextClass = Class.forName(DEFAULT_SERVLET_WEB_CONTEXT_CLASS);					break;				case REACTIVE:					contextClass = Class.forName(DEFAULT_REACTIVE_WEB_CONTEXT_CLASS);					break;				default:					contextClass = Class.forName(DEFAULT_CONTEXT_CLASS);				}			}			catch (ClassNotFoundException ex) {				throw new IllegalStateException(						"Unable create a default ApplicationContext, please specify an ApplicationContextClass", ex);			}		}		return (ConfigurableApplicationContext) BeanUtils.instantiateClass(contextClass);	}

AnnotationConfigServletWebServerApplicationContext类createWebServer方法,会创建我们配置的web容器。SLU28资讯网——每日最新资讯28at.com

private void createWebServer() {		WebServer webServer = this.webServer;		ServletContext servletContext = getServletContext();		if (webServer == null && servletContext == null) {			ServletWebServerFactory factory = getWebServerFactory();			this.webServer = factory.getWebServer(getSelfInitializer());			getBeanFactory().registerSingleton("webServerGracefulShutdown",					new WebServerGracefulShutdownLifecycle(this.webServer));			getBeanFactory().registerSingleton("webServerStartStop",					new WebServerStartStopLifecycle(this, this.webServer));		}		else if (servletContext != null) {			try {				getSelfInitializer().onStartup(servletContext);			}			catch (ServletException ex) {				throw new ApplicationContextException("Cannot initialize servlet context", ex);			}		}		initPropertySources();	}

这边使用了工厂模式,不同的web容器有自己的工厂。SLU28资讯网——每日最新资讯28at.com

SLU28资讯网——每日最新资讯28at.com

SLU28资讯网——每日最新资讯28at.com

SLU28资讯网——每日最新资讯28at.com

这边我们以TomcatServletWebServerFactory为例,看下它的getWebServerFactory方法。SLU28资讯网——每日最新资讯28at.com

public WebServer getWebServer(ServletContextInitializer... initializers) {		if (this.disableMBeanRegistry) {			Registry.disableRegistry();		}		Tomcat tomcat = new Tomcat();		File baseDir = (this.baseDirectory != null) ? this.baseDirectory : createTempDir("tomcat");		tomcat.setBaseDir(baseDir.getAbsolutePath());		Connector connector = new Connector(this.protocol);		connector.setThrowOnFailure(true);		tomcat.getService().addConnector(connector);		customizeConnector(connector);		tomcat.setConnector(connector);		tomcat.getHost().setAutoDeploy(false);		configureEngine(tomcat.getEngine());		for (Connector additionalConnector : this.additionalTomcatConnectors) {			tomcat.getService().addConnector(additionalConnector);		}		prepareContext(tomcat.getHost(), initializers);		return getTomcatWebServer(tomcat);	}

这边创建了tomcat容器并初始化,然后返回。SLU28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-88925-0.htmlSpring Boot 内嵌 Web 容器启动原理,惊爆你的眼球!

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 关于 Python 的十个核心概念精讲

下一篇: 一文彻底搞明白享元模式

标签:
  • 热门焦点
  • 三言两语说透设计模式的艺术-单例模式

    写在前面单例模式是一种常用的软件设计模式,它所创建的对象只有一个实例,且该实例易于被外界访问。单例对象由于只有一个实例,所以它可以方便地被系统中的其他对象共享,从而减少
  • 如何正确使用:Has和:Nth-Last-Child

    我们可以用CSS检查,以了解一组元素的数量是否小于或等于一个数字。例如,一个拥有三个或更多子项的grid。你可能会想,为什么需要这样做呢?在某些情况下,一个组件或一个布局可能会
  • 量化指标是与非:挽救被量化指标扼杀的技术团队

    作者 | 刘新翠整理 | 徐杰承本文整理自快狗打车技术总监刘新翠在WOT2023大会上的主题分享,更多精彩内容及现场PPT,请关注51CTO技术栈公众号,发消息【WOT2023PPT】即可直接领取
  • 微信语音大揭秘:为什么禁止转发?

    大家好,我是你们的小米。今天,我要和大家聊一个有趣的话题:为什么微信语音不可以转发?这是一个我们经常在日常使用中遇到的问题,也是一个让很多人好奇的问题。让我们一起来揭开这
  • “又被陈思诚骗了”

    作者|张思齐 出品|众面(ID:ZhongMian_ZM)如今的国产悬疑电影,成了陈思诚的天下。最近大爆电影《消失的她》票房突破30亿断层夺魁暑期档,陈思诚再度风头无两。你可以说陈思诚的
  • AMD的AI芯片转单给三星可能性不大 与台积电已合作至2nm制程

    据 DIGITIMES 消息,英伟达 AI GPU 出货逐季飙升,接下来 AMD MI 300 系列将在第 4 季底量产。而半导体业内人士表示,近日传出 AMD 的 AI 芯片将转单给
  • 滴滴违法违规被罚80.26亿 共存在16项违法事实

    滴滴违法违规被罚80.26亿 存在16项违法事实开始于2121年7月,历经一年时间,网络安全审查办公室对“滴滴出行”网络安全审查终于有了一个暂时的结束。据“网信
  • DRAM存储器10月价格下跌,NAND闪存本月价格与上月持平

    10月30日,据韩国媒体消息,自今年年初以来一直在上涨的 DRAM 存储器的交易价格仅在本月就下跌了近 10%,此次是全年首次降价,而NAND 闪存本月价格与上月持平。市
  • 北京:科技教育体验基地开始登记

      北京“科技馆之城”科技教育体验基地登记和认证工作日前启动。首批北京科技教育体验基地拟于2023年全国科普日期间挂牌,后续还将开展常态化登记。  北京科技教育体验基
Top