SpringBoot Boot内嵌Tomcat

Spring Boot应用服务部署——使用内嵌的tomcat容器 Spring Boot 应用服务部署有两种, 一种是传统的部署方式(没试验,暂时不清楚), 一种是使用Spring Boot内嵌的容器(tomcat 或者 jetty),本文介绍本文介绍的是基于内嵌的tomcat容器进行部署。 阅读详情

SpringBoot Boot内嵌Tomcat

Spring Boot:

SpringBoot-start-web 里面依赖的环境中

 

如果是外部的Tomcat 容器,可以通过修改config进行配置

内嵌的呢?

 

如何定制和修改Servlet容器的相关配置;

1、修改和server有关的配置(ServerProperties类【也是EmbeddedServletContainerCustomizer】);

经常用的: 

server.port=8081
server.context‐path=/crud
server.tomcat.uri‐encoding=UTF‐8

//通用的Servlet容器设置 server.xxx //Tomcat的设置 server.tomcat.xxx 最大连接数等等   

 

原理:

@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
public class ServerProperties {

    /**
     * Server HTTP port.
     */
    private Integer port;

    /**
     * Network address to which the server should bind.
     */
    private InetAddress address;

    @NestedConfigurationProperty
    private final ErrorProperties error = new ErrorProperties();

    /**
     * Whether X-Forwarded-* headers should be applied to the HttpRequest.
     */
    private Boolean useForwardHeaders;

    /**
     * Value to use for the Server response header (if empty, no header is sent).
     */
    private String serverHeader;

    /**
     * Maximum size of the HTTP message header.
     */
    private DataSize maxHttpHeaderSize = DataSize.ofKilobytes(8);

    /**
     * Time that connectors wait for another HTTP request before closing the connection.
     * When not set, the connector's container-specific default is used. Use a value of -1
     * to indicate no (that is, an infinite) timeout.
     */
    private Duration connectionTimeout;

    @NestedConfigurationProperty
    private Ssl ssl;

    @NestedConfigurationProperty
    private final Compression compression = new Compression();

    @NestedConfigurationProperty
    private final Http2 http2 = new Http2();

    private final Servlet servlet = new Servlet();

    private final Tomcat tomcat = new Tomcat();

    private final Jetty jetty = new Jetty();

    private final Undertow undertow = new Undertow();

    public Integer getPort() {
        return this.port;
    }

    public void setPort(Integer port) {
        this.port = port;
    }

    public InetAddress getAddress() {
        return this.address;
    }

 

 

2、编写一个EmbeddedServletContainerCustomizer:嵌入式的Servlet容器的定制器;来修改Servlet容器的配置 (已经过时了)
 

@Bean  //一定要将这个定制器加入到容器中
public EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer(){
    return new EmbeddedServletContainerCustomizer() {
        //定制嵌入式的Servlet容器相关的规则
        @Override
        public void customize(ConfigurableEmbeddedServletContainer container) {
            container.setPort(8083);
        }
    };
}

 

 

注册Servlet的三大组件 Servlet  Filter  Listener


 

Spring boot 默认以jar包的方式 启动嵌入式tomcat,而不是标准的web应用。 webapp/WEB-INF/web.xml

没有web.xml 也可以注册哦

 

ServletRegistrationBean

  

//注册三大组件
@Bean
public ServletRegistrationBean myServlet(){
    ServletRegistrationBean registrationBean = new ServletRegistrationBean(new
MyServlet(),"/myServlet");
    return registrationBean;
}

 

举个栗子:

 

 MyServlet:

public class MyServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("hello MyServlet");
    }
}

 

 config:

@Configuration
public class MyConfig {

    @Bean
    public ServletRegistrationBean<Servlet> myServlet(){ //是个class 直接new出来
        ServletRegistrationBean<Servlet> servletServletRegistrationBean =
                new ServletRegistrationBean<>(new MyServlet(),"/myServlet");
        return servletServletRegistrationBean;
    }
}

 

运行后:注册成功

FilterRegistrationBean

@Bean
public FilterRegistrationBean myFilter(){
    FilterRegistrationBean registrationBean = new FilterRegistrationBean();
    registrationBean.setFilter(new MyFilter());
    registrationBean.setUrlPatterns(Arrays.asList("/hello","/myServlet"));
    return registrationBean;
}

 

举个栗子:

config中加入组件:

 @Bean
    public FilterRegistrationBean myFilter(){
        FilterRegistrationBean<Filter> filterFilterRegistrationBean = new FilterRegistrationBean<>();
        filterFilterRegistrationBean.setFilter(new MyFilter());
        filterFilterRegistrationBean.setUrlPatterns(Arrays.asList("/hello","/myServlet"));
        return filterFilterRegistrationBean;
    }

 

过滤器:

public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("doFilter 方法執行");
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {

    }
}

 

 

请求后:

 

 

 

ServletListenerRegistrationBean

@Bean
public ServletListenerRegistrationBean myListener(){
    ServletListenerRegistrationBean<MyListener> registrationBean = new
ServletListenerRegistrationBean<>(new MyListener());
    return registrationBean;
}

 

举个栗子:

/**
 * listener 有好多的!
 */
public class MyListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("contextInitialized...............");
    }
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("contextDestroyed..................");
    }
}

组件注册进去:

    @Bean
    public ServletListenerRegistrationBean myListener(){
        ServletListenerRegistrationBean<MyListener> registrationBean = new ServletListenerRegistrationBean<>(
                new MyListener()); //通過構造函數  s
        return registrationBean;
    }

 

启动和退出

 

 

 

 总结:

Spring boot 帮我们自动配置Spring mvc的时候,自动注册了前端控制器,DispatcherServlet。 (DispatcherServletAutoConfiguration类)

 这个类中有个方法:

  

@Bean(name = DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME)
@ConditionalOnBean(value = DispatcherServlet.class, name =
DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)
public ServletRegistrationBean dispatcherServletRegistration(
      DispatcherServlet dispatcherServlet) {
   ServletRegistrationBean registration = new ServletRegistrationBean(
         dispatcherServlet, this.serverProperties.getServletMapping());
    //默认拦截: /  所有请求;包静态资源,但是不拦截jsp请求;   /*会拦截jsp
    //可以通过server.servletPath来修改SpringMVC前端控制器默认拦截的请求路径
   
   registration.setName(DEFAULT_DISPATCHER_SERVLET_BEAN_NAME);
   registration.setLoadOnStartup(
         this.webMvcProperties.getServlet().getLoadOnStartup());
   if (this.multipartConfig != null) {
      registration.setMultipartConfig(this.multipartConfig);
   }
   return registration;
}

 

 

 

总结一个思路:

  经常在看源码时候,发现定义一个接口,然后实现类是个中Factory命名的。通过某个工厂创建组件 xxFactory 是用來得到xx的!

  condition的用法,倒入哪個,那個生效。

 

posted @ 2019-04-27 14:48 toov5 阅读(...) 评论(...) 编辑 收藏

精尽Spring Boot源码分析 - 内嵌Tomcat容器的实现 概述 我们知道 Spring Boot 能够创建独立的 Spring 应用,内部嵌入 Tomcat 容器(Jetty、Undertow),让我们的jar无需放入 Servlet 容器就能直接运行。那么对于 Spring Boot 内部嵌入 Tomcat 容器的实现你是否深入的学习过?或许你可以通过这篇文章了解到相关内容。 在上一篇《SpringApplication 启动类的启动过程》文章分析了SpringApplication#run(String... args)启动 Spring 应用... 阅读详情

相关推荐

Linux 常用命令大全(2025 最新版)

掌握这些命令,你已能应对80% 的 Linux 日常操作!更多高级技巧(如crontab定时任务、iptables防火墙配置)可参考手册(man 命令名)或官方文档。实践是学习命令的最佳方式,建议在虚拟机或云服务器中多动手操作!

2302_79600390的博客 1896

Servlet学习

Servlet 1、Servlet简介 Servlet就是sun公司开发动态web的一门技术 Sun在这些API中提供一个接口叫做:Servlet,如果想开发一个Servlet程序,只需要完成两个小步骤: 编写一个类,实现Servlet接口 把开发好的java类部署到web服务器中 把实现了Servlet接口的Java程序叫做,Servlet 2、HelloServlet Servlet接口Sun公司有两个默认的实现类:HttpServlet, 1.构建一个普通的Maven项目,删除里面的src

weixin_40482420的博客 413

EGO-Planner文章解读(一)——论文原理和算法实现

详细解读egoplanner论文和代码

fegxg的博客 3989

【Servlet】HttpServletRequest、HttpServletResponse

HttpServletRequest、HttpServletResponse、以及前后端交互案例:表白墙

qq_41233305的博客 3651

iphone查看/private/var/mobile/Containers/Data/Application/文件

xcode查看iPhone的private/var/文件夹xcode连接iPhone真机选择app下载Containers文件夹到mac电脑中查看手机中下载的文件 使用xcode真机调试的时候,文件目录都是这种/private/var/mobile/Containers/Data/Application/FAEFDF4D-5CE4-474F-9C53-C19789DB59F6/tmp/ xcode连接iPhone真机 不需要越狱,使用xcode上连接iPhone,然后选择运行的app,选择window-&g

小手琴师的博客 101万+

(计算机组成原理)第二章数据的表示和运算-第二节:数字电路基础知识

本文介绍了计算机组成原理中的逻辑门电路、多路选择器和三态门。逻辑门电路包括基本逻辑运算(与、或、非)和复合逻辑运算(与非、或非、异或、同或),这些运算通过门电路实现,并满足分配律和结合律。多路选择器(MUX)用于从多个输入信号中选择一个输出,广泛应用于数据选择、资源共享和逻辑函数实现等场景。三态门则具有三种输出状态(高电平、低电平、高阻态),常用于总线控制和信号隔离。这些元件在数字电路设计和计算机系统中具有重要作用。

快乐江湖的博客 2474

Servlet & Spring Boot Web请求

一. 请求那我们所编写的XxxController 是如何处理请求的,又与Servlet之间有什么联系呢?通过该流程我们可以看出DispatcherServlet在Web请求当中是一个非常核心的一个类,所以这个类在Spring Boot当中我们称为核心控制器或者叫前端控制器。我们如何在Servlet程序当中来获取请求的参数呢?那Tomcat怎么就知道要给浏览器响应哪些数据呢?这就是Web应用程序整体的请求访问流程,对于我们来说,我们需要重点关注的就是我们所编写的Controller控制器程序。

weixin_53622554的博客 2879

Android性能分析深度指南:Perfetto工具全面解析

本文深入探讨Android性能优化工具Perfetto的应用与实践。作为Google推出的新一代追踪系统,Perfetto整合了CPU调度、内存分配、电池状态等多维度分析功能,通过高性能数据处理和可视化界面帮助开发者定位性能瓶颈。文章系统介绍了Perfetto的架构原理、配置方法和核心功能,包括CPU性能分析、内存泄漏检测等关键技术。通过电商应用卡顿优化的实战案例,展示了如何利用数学建模(如帧时间公式$T_{\text{render}}\leq16.67\text{ms}$)指导性能调优。

郑伟强dev的专栏 144

SpringBoot深度探究(一)模拟启动Tomcat

SpringBoot是目前最广泛的Web开发框架,其极度方便的开发特性得到市场的充分认可。这一系列的博客会进行一个详细的探讨,包括SpringBoot的原理模拟,SpringBoot源码解读,以及SpringBoot重要功能的官方文档的解读。俗话说了解一个组织就到打入这个组织内部,毕竟我就看一眼嘛。所以笔者会在Spring框架下,模拟一个SpringBoot的基本功能入手,然后在和SpringBoot的源码做对比,深度学习一下SpringBoot。

Smallc0de的博客 824

搬运机器人系列编程:KUKA KR QUANTEC_(2).KUKA KRL语言编程基础

定义一个函数END!调用函数PRINT "结果: ", result!定义一个过程PRINT msgEND!调用过程printMessage("欢迎使用 KUKA 机器人")!定义搬运零件的起始位置和目标位置!定义焊接路径的各个点!定义喷涂路径的各个点KUKA Robot Language (KRL) 是一种专门为工业机器人设计的编程语言,具有结构化编程、丰富的库函数、实时性以及集成性等特点。

zhubeibei168的博客 1246

【AFAC2026金融智能-赛题四】我做了一个疯狂的决定,把Embedding和Reranker全删了

本文介绍了AFAC2026金融智能挑战赛赛道四的解题思路,核心是在500万token的严格限制下实现金融长文本的高效问答。作者通过四步流水线(规划、BM25检索、记忆压缩、LLM推理)优化流程,重点创新在于: 采用零API调用的纯BM25检索,配合多路查询、封面页加权和页面邻接扩展等策略 设计高效的检索算法,从问题中提取专有名词并构建多路查询组合 深入理解评分公式,平衡准确率和token消耗,最终在准确率提升的同时将token消耗从数百万降至百万级 这些创新使方案在严格限制下实现了性能突破,展示了在资源受限

227

【SpringBoot】深入分析SpringBoot如何内嵌Tomcat容器

【一】总述 SpringBoot的诞生,极大的简化了Spring框架的使用过程,提升了开发效率,可以把它理解为一个整合包,使用了SpringBoot,就可以不用自己去进行繁琐的配置,通过几个简单的注解,就可以构建一个基于REST的服务。同时,SpringBoot的快速构建部署的特性,为当下大热的微服务落地提供了极大的便利,可以说是构建微服务的理想框架。 归纳来说SpringBoot的特性有如下几点...

陌北有棵树的博客 6142

SAP RAP学习系列合集介绍

《SAP RAP学习系列合集:从入门到部署的完整指南》摘要: 本文介绍了作者创建的SAP RAP学习系列合集,涵盖RAP开发从基础概念到实战部署的全流程。系列目前包含17篇文章,系统讲解了RAP核心开发技术:从数据建模、UI构建到行为定义(包括并发控制、草稿功能、授权验证等),最后详细演示了应用部署到Fiori Launchpad的两种方案(OP版和ES版)。

DeveloperMrMeng的博客 1491

Spring Boot内嵌Tomcat原理

基于Spring Boot 2.x,详细进行了Spring Boot项目的启动源码中的内嵌Tomcat的原理分析

终生学习践行者 3936

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Spring Boot 去除内嵌tomcat方法

1.pmo文件加上依赖 ​​​​​<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <!-- 去除内嵌tomcat --> <e...

weixin_40951242的博客 4501

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

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

springboot tomcat默认线程数_Spring Boot如何优化内嵌的Tomcat示例详解

前言本文主要给大家介绍了关于Spring Boot优化内嵌Tomcat的相关内容,分享出来供大家参考学习,下面话不多说了,来一看看详细的介绍吧。Spring Boot测试版本org.springframework.bootspring-boot-starter-parent1.3.3.RELEASEorg.springframework.bootspring-boot-starter-webSpr...

weixin_39850331的博客 452

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

springboot 替换tomcat_(023)Spring Boot之修改内嵌tomcat的3种方式

springboot内嵌了tomcat容器,可以通过3中方式来修改tomcat。(1)修改application.properties文件中属性,比如:server.port=8081server.address=127.0.0.1server.tomcat.accesslog.enabled=trueserver.tomcat.accesslog.directory=d\:/springboot...

weixin_42202724的博客 636

Spring Boot揭秘:一个JAR包如何神奇地启动内嵌Tomcat?

Spring Boot可执行JAR包通过巧妙设计实现内嵌Tomcat的一键启动。其核心机制包括:1) 特殊的JAR结构通过JarLauncher启动;2) 分层类加载器加载应用和依赖;3) SpringApplication在刷新上下文时自动创建Tomcat实例;4) 条件化自动配置动态判断Web环境。整个过程体现了约定优于配置的理念,开发者只需关注main方法,框架自动处理容器集成、Servlet注册等复杂逻辑,实现从传统WAR部署到轻量JAR的范式转变。

张小洛的BOLG 1469

Spring Boot 项目不用内嵌tomcat 发布到服务器tomcat配置

一:项目的pom.xml 文件去除内置tomcat依赖并添加servlet的依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</arti...

不受天磨非好汉,不遭人妒是庸才——着实着迷゛ 2960

Spring Boot内嵌Tomcat session超时问题

最近让Spring Boot内嵌Tomcat的session超时问题给坑了一把。 在应用中需要设置session超时时间,然后就习惯的在application.properties配置文件中设置如下, server.session.timeout=90 这里把超时时间设置的短些,主要想看看到底有没有起作用(不能设值30min然后再看吧,那样太不人道了)。结果没起作用,百度下发现Spr...

weixin_30263073的博客 1500

java 内嵌tomcat_spring boot实战之内嵌容器tomcat配置

本文介绍了spring boot实战之内嵌容器tomcat配置,分享给大家,具体如下:默认容器spring boot默认web程序启用tomcat内嵌容器tomcat,监听8080端口,servletPath默认为 / 通过需要用到的就是端口、上下文路径的修改,在spring boot中其修改方法及其简单;在资源文件中配置:server.port=9090server.contextPath=/l...

weixin_31937913的博客 286

【SpringBoot 快速开发】Tomcat 服务器入门:目录结构、部署方式与 Spring Boot 内嵌容器原理

本文摘要:Tomcat是Apache基金会开源的轻量级Web服务器和Servlet容器,支持Servlet/JSP规范。主要内容包括:1) Tomcat下载安装与环境配置;2) 常见问题处理(乱码、端口占用);3) 部署Web应用的三种方式;4) 目录结构与核心配置文件说明;5) SpringBoot内嵌Tomcat的简化配置。重点掌握Tomcat作为Servlet容器的作用、基本配置及与JavaEE规范的关系,建议开发使用SpringBoot内嵌Tomcat,生产环境可选择独立部署。

懿轩的技术小窝 2008

如何优雅的关闭基于Spring Boot 内嵌 Tomcat 的 Web 应用

背景 最近在搞云化项目的启动脚本,觉得以往kill方式关闭服务项目太粗暴了,这种kill关闭应用的方式会让当前应用将所有处理中的请求丢弃,响应失败。这种形式的响应失败在处理重要业务逻辑中是要极力避免的,所以我们需要一种更加优雅的方式关闭springBoot应用。 基本思路 首先我们关闭一个微服务应用可以分为两大步骤 关闭web应用服务器 关闭spring容器 我项目中使用的是内置的tomcat服...

weixin_47082274的博客 3349

Spring Boot之如何升级内嵌tomcat版本

文章目录Spring Boot之如何升级内嵌tomcat版本1. 背景2. 过程2.1 升级单模块项目的tomcat版本2.2 升级包含多个模块的项目3. 项目有打包子模块如何升级尾声 Spring Boot之如何升级内嵌tomcat版本 1. 背景 根据信息安全运营团队发布的Tomcat-AJP协议漏洞风险预警,Tomcat的AJP协议存在高危漏洞(默认8009端口)由于存在实现缺陷导致相关参数...

二营长 1万+

idea 内嵌tomcat吗_Intellij Idea下启动内嵌tomcat的spring boot项目

Spring Boot大大提高了web项目的开发。Intellij Idea支持打jar包、war包,然后部署到tomcat或jetty服务器上运行。但在开发环境下,我们希望项目的热部署,即改变代码后,立即在Intellij Idea上更新、运行最新的代码。这样大大提高开发速度。点击Intellij Idea界面的Run->Edit Configuration, 点击红色的+号,选择Mave...

weixin_33555586的博客 838

Spring Boot 内嵌 Tomcat 原理:Tomcat ServletWebServerFactory 源码解析

基于源码深度解析,Spring Boot 内嵌 Tomcat 原理:Tomcat ServletWebServerFactory 源码解析

m0_57877510的博客 606
上一篇: Spring boot错误处理以及定制错误页面
下一篇: SprigBoot核心技术
Art&Code
博客等级 码龄7年 77粉丝 554原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值