Spring Boot入门(七)-使用外置的Servlet容器

Spring Boot如何支持嵌入式Servlet容器【详解】 前言: 这篇文章主要介绍了Spring Boot如何支持嵌入式Servlet容器,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下。如果需要其他学习资料或教程的,可以点击进入,暗号:csyy,绝对免费提供!因为资料太多无法全部展示,这只是其中的一点点,需要学习的朋友,可以进来和其他小伙伴一起探讨学习! Spring Boot支持Tomcat、Jetty和Undertow三种Servlet容器嵌入到Web应用程序中,开发者使用starter即可方便嵌入,默认情况下,嵌入服务器的访问端口为 阅读详情

嵌入式Servlet容器:应用打成可执行的jar
优点:简单、便携;
缺点:默认不支持JSP,优化定制比较复杂(使用定制器【ServerProperties、自定义EmbeddedServletContainerCustomizer】,自己编写嵌入式Servlet容器的创建工厂【EmbeddedServletContainerFactory】);
外置的Servlet容器:外面安装Tomcat–应用war包的方式打包;

步骤

1)、必须创建一个war项目;(利用idea创建好项目目录结构)
2)、将嵌入式的tomcat指定为provided;

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-tomcat</artifactId>
   <scope>provided</scope>
</dependency>

3)、必须编写一个SpringBootServletInitializer的子类,并调用configure方法

public class ServletInitializer extends SpringBootServletInitializer {

   @Override
   protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
       //传入SpringBoot应用的主程序
      return application.sources(SpringBoot04WebJspApplication.class);
   }

}

4)、启动服务器就可以使用;

原理

jar包:执行SpringBoot主类的main方法,启动ioc容器,创建嵌入式的Servlet容器;
war包:启动服务器,服务器启动SpringBoot应用【SpringBootServletInitializer】,启动ioc容器;

Servlet3.0规范
8.2.4 Shared libraries / runtimes pluggability:

规则:

1)、服务器启动(web应用启动)会创建当前web应用里面每一个jar包里面ServletContainerInitializer实例:

2)、ServletContainerInitializer的实现放在jar包的META-INF/services文件夹下,有一个名为javax.servlet.ServletContainerInitializer的文件,内容就是ServletContainerInitializer的实现类的全类名

3)、还可以使用@HandlesTypes,在应用启动的时候加载我们感兴趣的类;

流程:
1)、启功tomcat
2)、org\springframework\spring-web\4.3.14.RELEASE\spring-web-4.3.14.RELEASE.jar!\META-INF\services\javax.servlet.ServletContainerInitializer:

Spring的web模块里面有这个文件:org.springframework.web.SpringServletContainerInitializer
4)、每一个WebApplicationInitializer都调用自己的onStartup;在这里插入图片描述
5)、相当于我们的SpringBootServletInitializer的类会被创建对象,并执行onStartup方法
6)、SpringBootServletInitializer实例执行onStartup的时候会creatRootAppicationContext;创建容器

protected WebApplicationContext createRootApplicationContext(
      ServletContext servletContext) {
    //1、创建SpringApplicationBuilder
   SpringApplicationBuilder builder = createSpringApplicationBuilder();
   StandardServletEnvironment environment = new StandardServletEnvironment();
   environment.initPropertySources(servletContext, null);
   builder.environment(environment);
   builder.main(getClass());
   ApplicationContext parent = getExistingRootWebApplicationContext(servletContext);
   if (parent != null) {
      this.logger.info("Root context already created (using as parent).");
      servletContext.setAttribute(
            WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, null);
      builder.initializers(new ParentContextApplicationContextInitializer(parent));
   }
   builder.initializers(
         new ServletContextApplicationContextInitializer(servletContext));
   builder.contextClass(AnnotationConfigEmbeddedWebApplicationContext.class);
    
    //调用configure方法,子类重写了这个方法,将SpringBoot的主程序类传入了进来
   builder = configure(builder);
    
    //使用builder创建一个Spring应用
   SpringApplication application = builder.build();
   if (application.getSources().isEmpty() && AnnotationUtils
         .findAnnotation(getClass(), Configuration.class) != null) {
      application.getSources().add(getClass());
   }
   Assert.state(!application.getSources().isEmpty(),
         "No SpringApplication sources have been defined. Either override the "
               + "configure method or add an @Configuration annotation");
   // Ensure error pages are registered
   if (this.registerErrorPageFilter) {
      application.getSources().add(ErrorPageFilterConfiguration.class);
   }
    //启动Spring应用
   return run(application);
}

7)、Spring的应用就启动并且创建IOC容器

public ConfigurableApplicationContext run(String... args) {
   StopWatch stopWatch = new StopWatch();
   stopWatch.start();
   ConfigurableApplicationContext context = null;
   FailureAnalyzers analyzers = null;
   configureHeadlessProperty();
   SpringApplicationRunListeners listeners = getRunListeners(args);
   listeners.starting();
   try {
      ApplicationArguments applicationArguments = new DefaultApplicationArguments(
            args);
      ConfigurableEnvironment environment = prepareEnvironment(listeners,
            applicationArguments);
      Banner printedBanner = printBanner(environment);
      context = createApplicationContext();
      analyzers = new FailureAnalyzers(context);
      prepareContext(context, environment, listeners, applicationArguments,
            printedBanner);
       
       //刷新IOC容器
      refreshContext(context);
      afterRefresh(context, applicationArguments);
      listeners.finished(context, null);
      stopWatch.stop();
      if (this.logStartupInfo) {
         new StartupInfoLogger(this.mainApplicationClass)
               .logStarted(getApplicationLog(), stopWatch);
      }
      return context;
   }
   catch (Throwable ex) {
      handleRunFailure(context, listeners, analyzers, ex);
      throw new IllegalStateException(ex);
   }
}

启动Servlet容器,再启动SpringBoot应用

Java 大视界 -- Java+Spark MLlib 构建智能推荐系统:协同过滤算法实战与优化(441) Java+Spark MLlib构建智能推荐系统实战 本文详细介绍了基于Java和Spark MLlib构建协同过滤推荐系统的全流程实践方案。主要内容包括: 架构设计:采用离线批处理为主、近实时更新为辅的架构,包含数据采集层、处理层、模型层、推荐生成层、存储层和应用层六大模块,可支撑千万级用户推荐需求。 技术实现: 使用Spark MLlib的ALS算法进行协同过滤模型训练 提供数据清洗、模型训练、推荐生成等核心代码实现 采用MySQL存储推荐结果,支持批量插入和事务保障 生产级优化: 版本化模型存储规避覆 阅读详情

相关推荐

本地部署 pyvideotrans(视频翻译配音工具)

语音识别选择faster-whisper(本地),模型选择预先下载并保存的medium,然后选择好要处理的视频以及保存到的位置,这里我选择了一个名为why not的英文演讲视频,保存在桌面_vedio_out文件下。将附件中faster-medium.7z 和 faster-small.7z解压到项目中的models目录下, 解压后,目录中应该存在 models--Systran--faster-whisper-small。en.m4a|.wav = 原始视频中的音频文件(包含所有背景音和人声)

西唯兵欧泡的博客 2342

SpringBoot的启动方式,以及SpringApplicationBuilder

今天在翻阅代码的时候,在主启动类偶然看见了SpringApplicationBuilder这样的代码,我也是第一次接触,对SpringApplicationBuilder的作用感到好奇 查阅了一些资料,明白了它的作用,首先SpringBoot的启动方式,大家都很了解了 但这类方式启动会有一个问题,那就是它默认的读取配置文件用的是application.yml或者application.properties,这就会导致,如果一个项目中有多个配置文件,比如需要配置测试环境,线上环境,运行

qq_51778285的博客 8345

避坑指南:MTK平台Widevine L1密钥安装全流程详解(含SP META工具使用与Log分析)

本文详细解析了MTK平台实现Widevine L1认证的全流程,涵盖密钥申请、格式转换、安全烧录等关键步骤,特别针对Trustonic TEE环境下的SP META工具使用与日志分析提供实用指南。帮助开发者规避常见错误,确保DRM密钥安全部署,满足高端内容保护需求。

weixin_27219587的博客 476

Spring Boot启动方式:SpringApplicationBuilder

但这类方式启动会有一个问题,那就是它默认的读取配置文件用的是application.yml或者application.properties,这就会导致,如果一个项目中有多个配置文件,比如需要配置测试环境,线上环境,运行环境的时候,对库进行切换,这种情况下就需要使用SpringApplicationBuilder来进行指定。将我们当前项目的启动类通过SpringApplicationBuilder类中的sources放入(其实并不会走启动类的main方法了,只是需要启动类的元数据信息,比如启动注解)。

qq_22905801的博客 536

逆向分析TikTok的Cronet网络库:定位libsscronet.so并Hook关键SSL函数

本文深入探讨了逆向分析TikTok的Cronet网络库的技术细节,重点介绍了如何定位libsscronet.so并Hook关键SSL函数。通过Java到Native的调用链路追踪、So库定位策略和SSL验证函数的动态Hook技巧,帮助开发者突破定制化网络库的协议加密防护,实现流量解密和协议分析。

weixin_27875131的博客 971

SATA硬件电路设计实战:从接口规范到高速布线技巧

本文深入探讨了SATA硬件电路设计的核心要点与实战技巧。从接口物理电气规范、AC耦合电容与阻抗控制等基础,到FPGA/SoC高速收发器选型配置,再到应对6Gbps高速信号的PCB布局布线艺术,系统性地解析了SATA电路设计中的关键挑战与解决方案,助力工程师规避常见陷阱,实现稳定可靠的存储接口设计。

tech5的博客 531

springboot 启动流程(一) 借助外部容器启动

对springboot项目,可以通过两种方式启动服务,一是利用内嵌的Tomcat作为web容器启动,两一种方式是借助外部容器启动。本章先介绍通过外部容器启动的源码流程。 一、springboot 借助外部容器 @EnableSwagger2 @SpringBootApplication public class Application extends SpringBootServletIni...

西木风落 1362

《低功耗方法学》翻译——前言

前言

记录所学,分享知识,结识挚友 1208

boot项目外部服务器启动,SpringBoot 使用外部服务器的启动流程

1,启动tomcat2,加载如下路径的类①,org\springframework\spring-web\4.3.14.RELEASE\spring-web-4.3.14.RELEASE.jar!\META-INF\services\javax.servlet.ServletContainerInitializer②,Spring的web模块里面有这个文件:org.springframework....

weixin_32401411的博客 501

4D毫米波雷达天线设计

多种天线布局方案介绍、天线设计要点介绍

5734

光学设计仿真软件:Code V_(8).场曲和色差校正

通过以上步骤和代码示例,用户可以更好地理解如何在Code V中进行场曲和色差的校正。这些技术不仅有助于提高光学系统的成像质量,还可以为后续的光学设计提供重要的参考。在实际应用中,用户可以根据具体需求选择合适的校正方法和优化策略,以达到最佳设计效果。

kkchenjj的博客 1784

使用外置容器开发项目

比较嵌入式和外置servlet容器: 1 .嵌入式Servlet容器:运行启动类就可启动,或将项目打成可执行的 jar 包 优点:简单、快捷; 缺点:默认不支持JSP、优化定制比较复杂使用定制器, 还需要知道 每个功能 的底层原理 2. 外置Servlet容器:配置 Tomcat, 将项目部署到Tomcat中运行 缺点:一个一个部署到tomcat 使用tomcat作为外置容器 1.创建war类型项目 2.指定webapp目录 ...

grow_的博客 190

电源芯片MPQ3431A

MPQ3431A是一款具有宽输入范围的固定频率为450kHz的高度集成的升压转换器,其输入电压低至2.7V,采用恒定关断时间(COT)的控制拓扑,可提供快速的瞬态响应。芯片支持通过MODE管脚配置PSM(pulse-skip mode)、FCCM(forced continuous conduction mode)和USM(ultrasonic mode);还支持通过电流限制配置来达到精确的过流保护;同时芯片欠压保护(UVLO)和过温保护(OTP)。MPQ3431A采用QFN-13(3mmx4mm)封装。保

qflook的博客 1560

Spring Boot 使用外置 Servlet 容器:从配置到部署全指南

在 Spring Boot 开发中,我们通常使用嵌入式 Servlet 容器(如 Tomcat),它能将应用打包成可执行 JAR,简化部署流程。但在某些场景下(如需要支持 JSP、复杂的容器定制或企业级部署规范),我们需要使用外置 Servlet 容器。本文将详细介绍如何配置 Spring Boot 使用外置 Tomcat,并解释其工作原理。

m0_61261153的博客 917

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

六:使用外置的Servlet容器

(一)嵌入式的Servlet容器(Jar) 优点:简单,便携 缺点:默认不支持JSP、优化定制比较复杂(使用定制器ServerProperties、自定义EmdeddedServletContainerCustomizer 或者 自己编写嵌入式Servlet容器的创建工厂EmbeddedServletContainerFactory) (二)外置Servlet容器 好处:可以使用JSP(嵌入式的也...

发现问题,面对问题,分析问题,解决问题,总结问题 1426

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Springboot使用外置的Servlet容器

二.外置tomcat启动项目:嵌入式Servlet:应用打成可执行的jar优点:简单、便携缺点:默认不支持JSP、优化定制比较复杂外置的Servlet:外面安装Tomcat---应用war包的方式打包。

秃头之旅 1172

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Spring Boot 使用外置的 Servlet 容器&启动原理

嵌入式 Servlet 容器:应用打成可执行的jar包 优点:简单,便携 缺点:默认不支持JSP,优化定制比较复杂(使用定制器【ServerProperties、自定义EmbeddedServletContainerCustomizer】,自己编写嵌入式Servlet容器的创建工厂【EmbeddedServletContainerFactory】 ); 外置的Servle...

Java_Glory的博客 309

Spring Boot 内置与外置Servlet容器讲解(六)

1、配置嵌入式Servlet容器 SpringBoot默认使用Tomcat作为嵌入式的Servlet容器; 问题? 1)、如何定制和修改Servlet容器的相关配置; 1、修改和server有关的配置(ServerProperties【也是EmbeddedServletContainerCustomizer】); server.port=8081 server.context...

hfbin的博客 1万+

Spring Boot Web开发-使用外置的Servlet容器

SpringBoot使用外置的Servlet容器 1、嵌入式Servlet容器:应用打成可执行的jar包 ​ 优点:简单、便携 ​ 缺点: 默认不支持JSP 优化定制比较复杂(使用定制器【ServerProperties、自定义EmbeddedServletContainerCustomizer】,自己编写嵌入式Servlet容器的创建工厂【EmbeddedServletContain...

蒟蒻码农的博客 305

Spring Boot 之 Servlet容器 配置和启动流程

Spring Boot 之 Servlet 容器配置和启动流程。

bluemysky的博客 2552

Spring Boot外置Servlet容器和docker

主要包括使用外置的servlet容器的步骤和原理,以及docker的简介和核心概念 1、使用外置的Servlet容器 嵌入式Servlet容器:应用打成可执行的jar ​ 优点:简单、便携; ​ 缺点:默认不支持JSP、优化定制比较复杂(使用定制器【ServerProperties、自定义EmbeddedServletContainerCustomizer】,自己编写嵌入式Servlet容器...

冢狐的私人空间 835

SpringBoot外置Servlet容器

SpringBoot外置Servlet容器

jlihan的博客 806

在SpringBoot中使用外置的Servlet容器

嵌入式Servlet容器:应用打成可执行的jar ​ 优点:简单、便携; ​ 缺点:默认不支持JSP、优化定制比较复杂(使用定制器【ServerProperties、自定义EmbeddedServletContainerCustomizer】,自己编写嵌入式Servlet容器的创建工厂【EmbeddedServletContainerFactory】); 外置的Servlet容器:外面安装Tomcat—应用war包的方式打包; 步骤 1)、必须创建一个war项目;(利用idea创建好目录结构) 2)、将

ClearLex的博客 286

25 SpringBoot使用外置的Servlet容器

嵌入式Servlet容器:应用打成可执行的jar 优点:简单、便携; 缺点:默认不支持JSP、优化定制比较复杂(使用定制器【ServerProperties、自定义EmbeddedServletContainerCustomizer】,自己编写嵌入式Servlet容器的创建工厂【EmbeddedServletContainerFactory】); 外置的Servlet容器:外面安装Tomcat—应...

阿甘兄 757

SpringBoot自学好几天 中途开始写笔记 SpringBoot Web开发 使用外置Servlet容器 20190211

嵌入式Servlet容器: 优点: 简单 便捷 缺点:默认不支持Jsp 优化定制比较复杂(使用定制器【serverProperties、WebServerFactoryCustomizer】); 外置Servlet容器 生成webapp: 方法1: 0) 1) 2) 3) 4) 5)修改地址 \src\webapp\WEB-IN\web.xml 6)apply 7)查看是否生成 服...

qq_36291682的博客 3000

嵌入与外置的Servlet容器区别

一:嵌入与外置的Servlet容器区别1、嵌入式Servlet容器1、应用打成可执行的jar 优点: 简单、便携; 缺点: 默认不支持JSP、优化定制比较复杂杂(使用定制器【ServerProperties、自定义WebServerFactoryCustomizer】,自己编写嵌入式Servlet容器的创建工厂【ServletWebServerFactoryConfiguration】)2、外...

cpongo55 607
上一篇: SpringBoot入门(六)-配置嵌入式Servlet容器
下一篇: 安装Jenkins实例似乎已离线详细解决步骤
代码魔法师Sunny
博客等级 码龄10年 377粉丝 189原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值