springboot 使用tomcat详解

news2024/11/25 18:27:48

1.使用内嵌tomcat启动

  • 创建tomcat对象
  • 设置端口
  • 设置Context
  • 设置servlet 和 路径

2.spring中单独注册servlet和地址的映射关系

    @Bean
    public ServletRegistrationBean getServletRegistrationBean() {
        ServletRegistrationBean bean = new ServletRegistrationBean(apiServlet);
        bean.addUrlMappings("/self");
        return bean;
    }
  • tomcat启动肯定要注册项目的地址和servlet的映射
  • 如果spring中注册了ServletRegistrationBean 那肯定也要把用户注册的servlet也添加到tomcat

3.分析源码,springboot既然使用了tomcat, 那么上面几个步骤肯定都是要有的

AbstractApplicationContext.java

 

ServletWebServerApplicationContext.java       

 

createWebServer() 

 

  •   this.getWebServerFactory(); 从spring容器中获取  ServletWebServerFactory类型的bean,我们这里注册的是  TomcatServletWebServerFactory 
  • factory.getWebServer(new ServletContextInitializer[]{this.getSelfInitializer()});会调用到tomcat的实现,记得这里的参数,很重要的
ServletContextInitializer是函数式接口

getSelfInitializer(); 定义函数式接口的实现

 就把上面定义的函数式接口的实现进行传递,当调用函数式接口的方法的时候,就会调用上面定义的实现方法  -- 这里要明白,不然你后面不知道是怎么调用到这里来的

this.webServer = factory.getWebServer(new ServletContextInitializer[]{this.getSelfInitializer()});

 

TomcatServletWebServerFactory.Java

this.prepareContext(tomcat.getHost(), initializers);

 

this.configureContext(context, initializersToUse);

 

TomcatStarter 注意 该类实现 ServletContainerInitializer ,这个是servlet-api的接口,tomcat启动会调用该实现类的onStartUp方法();

 

this.getTomcatWebServer(tomcat);启动tomcat的方法

 

 

 启动tomcat

 

启动之后,会调用到ServletContainerInitializer的实现类的onstartUp()方法中;上面说到了

最终会调用到ServletWebServerApplicationContext.Java 的selfInitialize的方法实现中

 

Iterator var2 = this.getServletContextInitializerBeans();该方法就会返回需要servlet初始化的bean对象集合 

我打断点查看返回的beans

 

 创建了

ServletContextInitializerBeans对象

 

 记得我们最开始注册的bean叭,就是SerlvetRegistrationBean,这里就把beanFactory中类型为这个bean的所有对象进行保存

 所以,当我们这里调用onStartUp()时,就会进入到SerlvetRegistrationBean的方法中;

为啥这里方法的实现只有这两个呢,是因为SerlvetRegistrationBean继承RegistrationBean, 所以调用会调用父类的onstartUp(),也就是RegistrationBean的onstartUp()方法;

附上:类图

 进入RegistrationBean的方法中

 

RegistrationBean

  • String description = this.getDescription();返回servlet的名称,我们创建ServletRegistrationBean的时候
            1.构造方法中会传入Servlet对象
            2.调用对象方法配置url
  • this.register(description, servletContext);就是进行注册了
    1.D registration = this.addRegistration(description, servletContext);

    2.this.configure(registration);

 结束,当然我们的DispathcerServlet也是这样注册的奥

附上:   DispatcherServletRegistrationBean注册的过程

自己思考在哪里注册的:

       肯定实在某个地方进行注册的,不可能无故出现叭;

        分析使用DispathcerServlet肯定是在springmvc中, 所以肯定是在spring.factories文件中配置了自动装配的类,在这个类中进行的注册

 spring.factories找到  DispatcherServletAutoConfiguration类

注册 DispatcherServletRegistrationBean,

那么你肯定又有疑问了, tomcat明明过滤的是SerlvetRegistrationBean类型,那DispatcherServletRegistrationBean可以吗?

-- 你是忘记继承了吗!只要DispatcherServletRegistrationBean继承SerlvetRegistrationBean不就可以了吗

 

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

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

相关文章

免费GPU攻略

白嫖kaggle kaggle每周会送38个小时,16GB显存。 验证手机号 根据 kaggle问答可知,需要手机号短信验证,账号才能用GPU。国内的手机号都是可用的。操作如下: 点击右上角头像,点击Account。 到了个人详情页后&#xf…

基于JAVA springboot+mybatis智慧生活分享平台设计和实现

基于JAVA springbootmybatis智慧生活分享平台设计和实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取…

【MySQL进阶】执行一条 sql 语句,期间会发生什么

【MySQL进阶】执行一条 sql 语句,期间会发生什么? 文章目录【MySQL进阶】执行一条 sql 语句,期间会发生什么?MySQL 执行流程是怎样的?第一步:连接器第二步:查询缓存第三步:解析 SQL解析器第四步&#xff…

Google Play Install Referrer API 和 Facebook App Ads Referral 集成

介绍:由于需要精准的获取投放广告的数据(投放的平台,防止数据的丢失等)。我们使用了Google Play Install Referrer API 和Facebook App Ads Referral结合采集数据,然后通过后台服务记录数据。最后服务器记录的数据与Fa…

openwrt tc(traffic contrl)配置及使用

在某些情况下,嵌入式设备需要用到弱网环境进行测试。网上针对tc的配置有很多,但是7688的没找到,所以做个记录,方便大家使用。netem配置 Kernel modules > Network Support > kmod-netemqos-scripts配置> Base system >…

甲氧基聚乙二醇-葡聚糖 mPEG-Dextran结构式;Dextran-PEG科研实验用

甲氧基聚乙二醇-葡聚糖 mPEG-Dextran 中文名称:甲氧基聚乙二醇-葡聚糖 英文名称:mPEG-Dextran 规格:500mg/1g/5g/10g 分散系数:小于等于1.05 分子量(PEG):2000;3400&#xff1b…

Jmeter5.0之 dubbo插件安装

我记得之前 这个链接:https://github.com/ningyu1/jmeter-plugins-dubbo/tree/master/dist 能下载现成的dubbo插件,现在这个链接访问后提示404、网上搜索提供了最新的获取方式,1、访问链接:https://github.com/ningyu1/jmeter-plu…

ForkJoin

什么是ForkJoin ForkJoin在JDK1.7,并行执行任务!提高效率,大数据量! 大数据:Map Reduce(把大任务拆分为小任务) ForkJoin特点:工作窃取 这个里面维护的都是双端队列 当第一行的任务执…

AJAX

目录1 AJAX 快速入门1.1 介绍1.2 原生 JavaScript 实现 AJAX1.3 原生JS实现AJAX详解1.4 jQuery 的 GET 方式实现 AJAX1.5 jQuery 的 POST方式实现 AJAX1.5 jQuery 的 通用方式实现 AJAX2 JSON 的处理2.1 JSON 回顾2.2 JSON 转换工具的介绍2.3 JSON转换练习3 案例-搜索联想4 案例…

git 切换分支

1. 查看远程分支,查看当前所有git branch -a 2. 查看本地分支git branch * master3. 切换分支 //创建分支 git checkout -b test origin/test //切换分支 git checkout 分支名

iframe 页面间的通信(分享)

文章目录1. 概述2. 页面之间传递数据3. 直接获取父页面的数据4. 获取父级页面源的信息1. 概述 在许多老的项目中使用的都是 iframe 进行的页面嵌套,我这里写了三个页面进行演示红色的页面为最外层,本地开的服务,端口为 5500,而黄色…

官宣了,德云社京剧神童陶阳亮相河南春晚,为什么不是老乡岳云鹏

随着春节的临近,一年一度的央视春晚,也即将拉开大幕与观众见面,不过今年却略有不同。虽然央视春晚还没有开播,互联网上面就一片抵触声音,有人甚至给出了建议,希望省下钱给大家发红包。 与央视春晚形成鲜明对…

未来的分析型数据库是什么样的?

本文来自于 Doris Summit 2022 演讲实录,演讲人:陈明雨十年对于数据库意味着什么?身处在日新月异的时代,我们见惯了技术的兴起与繁荣、变迁与衰落,甚至是朝荣夕灭。信息技术以前所未有的速度更迭,给周遭事物…

从0到1完成一个Vue后台管理项目(十四、对话框封装、接口联通、api优化 很重点(封装思想))

往期 从0到1完成一个Vue后台管理项目(一、创建项目) 从0到1完成一个Vue后台管理项目(二、使用element-ui) 从0到1完成一个Vue后台管理项目(三、使用SCSS/LESS,安装图标库) 从0到1完成一个Vu…

React Fiber 树思想,解决业务实际场景

熟悉 Fiber 树结构 我们知道,React 从 V16 版本开始采用 Fiber 树架构来实现渲染和更新机制。 Fiber 在 React 源码中可以看作是一个任务执行单元,每个 React Element 都会有一个与之对应的 Fiber 节点。 Fiber 节点的核心数据结构如下: …

基于javaweb+springboot+HTML汽车配件管理系统设计和实现以及文档报告

基于javaweb(springboot)汽车配件管理系统设计和实现以及文档报告 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言…

Java面试题,这是一篇会一直更新的博客!欢迎大家留言~

Java面试题1、面向对象与面向过程2、Spring源码分析(可能比较复杂,但是看下去可能会找到让你顿悟的字眼)2.1、Spring创建Bean对象2.2 实例化(推断构造方法)1、面向对象与面向过程 封装:封装在于明确标识出允…

快递驿站取件管理系统|基于SpringBoot的快递栈系统设计与实现

作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容:Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

商场楼层地图怎么制作,高效、便捷的商场二三维地图绘制平台

当顾客走进庞大的商场购物中心,如何让顾客在商场购物消费时有更轻松方便的体验?如何能快速将品牌和商品传递给潜在顾客,并一键引导顾客到店?电子地图作为大家最喜闻乐见的高效应用形式,在商业应用中,不论针…

arduinoIDE下载keypad和password库文件

任务需求:需要使用4*4矩阵键盘来完成一个按键密码锁 需要使用keypad和password这两个开源库 开源库的查找 1.在IDE中直接查找 同时在更多中能够看到api文档 2.在官网中进行找寻 至于导入的方式比较简单就不做叙述 keypad库文件文档api分析 api可以在官网中有…