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

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

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

一、spring boot内嵌web容器介绍

Spring Boot 支持以下内嵌的 Web 容器:1Yy28资讯网——每日最新资讯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 容器,并进行相应的配置和启动。1Yy28资讯网——每日最新资讯28at.com

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

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

以jetty为例,我们只需要将默认的tomcat依赖排除,并将jetty依赖引入,即可完成内嵌web容器的切换。1Yy28资讯网——每日最新资讯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确实启动了。1Yy28资讯网——每日最新资讯28at.com

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

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

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

Spring Boot 内嵌 Web 容器的启动原理可以概括为以下几个步骤:1Yy28资讯网——每日最新资讯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 容器中运行,可以通过访问指定的端口来访问应用程序的功能。

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

SpringApplication类createApplicationContext方法,根据当前web应用的类型选择匹配的应用上下文类型,这边会创建AnnotationConfigServletWebServerApplicationContext。1Yy28资讯网——每日最新资讯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容器。1Yy28资讯网——每日最新资讯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容器有自己的工厂。1Yy28资讯网——每日最新资讯28at.com

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

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

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

这边我们以TomcatServletWebServerFactory为例,看下它的getWebServerFactory方法。1Yy28资讯网——每日最新资讯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容器并初始化,然后返回。1Yy28资讯网——每日最新资讯28at.com

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

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

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

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

标签:
  • 热门焦点
  • 官方承诺:K60至尊版将会首批升级MIUI 15

    官方承诺:K60至尊版将会首批升级MIUI 15

    全新的MIUI 15今天也有了消息,在官宣了K60至尊版将会搭载天玑9200+处理器和独显芯片X7的同时,Redmi给出了官方承诺,K60至尊重大更新首批升级,会首批推送MIUI 15。也就是说虽然
  • 容量越大越不坏?24万块硬盘故障率报告公布 这些产品零故障

    容量越大越不坏?24万块硬盘故障率报告公布 这些产品零故障

    8月5日消息,云存储服务商Backblaze发布了最新的硬盘故障率报告,年故障率有所上升。Backblaze发布的硬盘季度统计数据,其中包括故障率等重要方面。这些结
  • 三言两语说透设计模式的艺术-简单工厂模式

    三言两语说透设计模式的艺术-简单工厂模式

    一、写在前面工厂模式是最常见的一种创建型设计模式,通常说的工厂模式指的是工厂方法模式,是使用频率最高的工厂模式。简单工厂模式又称为静态工厂方法模式,不属于GoF 23种设计
  • 每天一道面试题-CPU伪共享

    每天一道面试题-CPU伪共享

    前言:了不起:又到了每天一到面试题的时候了!学弟,最近学习的怎么样啊 了不起学弟:最近学习的还不错,每天都在学习,每天都在进步! 了不起:那你最近学习的什么呢? 了不起学弟:最近在学习C
  • 共享单车的故事讲到哪了?

    共享单车的故事讲到哪了?

    来源丨海克财经与共享充电宝相差不多,共享单车已很久没有被国内热点新闻关照到了。除了一再涨价和用户直呼用不起了。近日多家媒体再发报道称,成都、天津、郑州等地多个共享单
  • 大厂卷向扁平化

    大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 三星获批量产iPhone 15全系屏幕:苹果史上最惊艳直屏

    三星获批量产iPhone 15全系屏幕:苹果史上最惊艳直屏

    按照惯例,苹果将继续在今年9月举办一年一度的秋季新品发布会,有传言称发布会将于9月12日举行,届时全新的iPhone 15系列将正式与大家见面,不出意外的话
  • Counterpoint :OPPO双旗舰战略全面落地 高端产品销量增长22%

    Counterpoint :OPPO双旗舰战略全面落地 高端产品销量增长22%

    2023年6月30日,全球行业分析机构Counterpoint Research发布的《中国智能手机高端市场白皮书》显示,中国智能手机品牌正在寻求高质量发展,中国高端智能
  • AI艺术欣赏体验会在上海梅赛德斯奔驰中心音乐俱乐部上演

    AI艺术欣赏体验会在上海梅赛德斯奔驰中心音乐俱乐部上演

    光影交错的镜像世界,虚实幻化的视觉奇观,虚拟偶像与真人共同主持,这些场景都出现在2019世界人工智能大会的舞台上。8月29日至31日,“AI艺术欣赏体验会”在上海
Top