【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】

一.知识回顾

【0.SpringBoot专栏的相关文章都在这里哟,后续更多的文章内容可以点击查看】
【1.SpringBoot初识之Spring注解发展流程以及常用的Spring和SpringBoot注解】
【2.SpringBoot自动装配之SPI机制&SPI案例实操学习&SPI机制核心源码学习】
【3.详细学习SpringBoot自动装配原理分析之核心流程初解析-1】
【4.详细学习SpringBoot自动装配原理之自定义手写Starter案例实操实战-2】
【5.IDEA中集成SpringBoot源码环境详细步骤讲解】
【6.初识SpringBoot核心源码之SpringApplication构造器以及run方法主线流程-3】
【7.详细学习SpringBoot核心源码之SpringApplication构造器&Run方法源码详细流程-4】
【8.详细学习SpringBoot核心源码之监听器原理-5(观察者设计模式、初始化并加载监听器核心流程、事件的发布器核心流程、SpringBoot中默认的监听器以及默认的事件类型)】
【9.详细学习SpringBoot源码之自定义监听器实战演练-6(自定义监听器、自定义监听事件、指定监听事件)】
【10.详细学习SpringBoot源码之属性配置文件加载原理(application.properties|application.yaml)-7】
【11.详细学习SpringBoot源码之属性配置文件加载原理(Bootstrap.properties|Bootstrap.yml)-8】

【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】_第1张图片

二.Tomcat源码环境构建

2.1 源码构建方式-官网下载

Tomcat官方网站

【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】_第2张图片

【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】_第3张图片

2.2 源码构建方式-GitHub下载

GitHub上查找Tomcat对应的版本

【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】_第4张图片

选择对应的对应的版本进行下载
【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】_第5张图片

三.Maven环境搭建

3.1 环境准备

打开IEDA导入项目,然后在项目中创建一个新的pom.xml文件,里面的内容为:
【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】_第6张图片


<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
            http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0modelVersion>

  <groupId>org.apache.tomcatgroupId>
  <artifactId>apache-tomcatartifactId>
  <version>8.5version>

  <dependencies>
    <dependency>
      <groupId>org.apache.antgroupId>
      <artifactId>antartifactId>
      <version>1.10.4version>
    dependency>
    <dependency>
      <groupId>wsdl4jgroupId>
      <artifactId>wsdl4jartifactId>
      <version>1.6.2version>
    dependency>
    <dependency>
      <groupId>javax.xmlgroupId>
      <artifactId>jaxrpc-apiartifactId>
      <version>1.1version>
    dependency>
    <dependency>
      <groupId>org.eclipse.jdt.core.compilergroupId>
      <artifactId>ecjartifactId>
      <version>4.5.1version>
    dependency>
    <dependency>
      <groupId>junitgroupId>
      <artifactId>junitartifactId>
      <version>4.13version>
    dependency>
  dependencies>

  <build>
    <finalName>apache-tomcatfinalName>
    <sourceDirectory>javasourceDirectory>
    <resources>
      <resource>
        <directory>javadirectory>
      resource>
    resources>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.pluginsgroupId>
        <artifactId>maven-compiler-pluginartifactId>
        <version>3.6.1version>
        <configuration>
          <source>1.8source>
          <target>1.8target>
          <encoding>UTF-8encoding>
        configuration>
      plugin>
    plugins>
  build>
project>

然后设置项目为Maven项目,选中pom.xml文件,鼠标右点。选择 Add as Maven Project .
等待依赖导入成功后的响应。
【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】_第7张图片

3.2 启动项目并解决中文乱码问题

中文乱码问题的解决方案,修改两处地方即可:

1.修改org.apache.jasper.compiler包目录结构下Localizer类getMessage(java.lang.String)方法
【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】_第8张图片

【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】_第9张图片

2.修改org.apache.tomcat.util.res包下StringManager类的getString(java.lang.String)

【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】_第10张图片
启动项目
【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】_第11张图片
运行结果展示:
【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】_第12张图片

3.3 解决不支持JSP的问题

启动成功后,在访问首页的时候,出现了500错误,而且提示 无法为JSP编译类

【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】_第13张图片

原因是无法编译jsp。解决也很简单,按照下面步骤操作即可

上面的报错解决方式,可以在org.apache.catalina.startup包下ContextConfig类中的configureStart方法中,添加一下JSP解析器初始化即可

添加JSP初始化操作,完成JSP的支持
【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】_第14张图片
访问测试,启动成功
【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】_第15张图片
至此,Tomcat源码就导入成功了,我们可以大致的学习一下Tomcat相关的概念。后续我们在Tomcat专栏中学习Tomcat源码相关的知识,敬请期待。接下来我们来学习一下在SpringBoot源码中Tomcat的加载原理分析。

四.SpringBoot中内嵌Tomcat启动原理分析

4.1 查看SpringBoot中自动装配的类

4.1.1 EmbeddedWebServerFactoryCustomizerAutoConfiguration

【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】_第16张图片

在这个配置类里面就是根据我们的配置来内嵌对应的Web容器,比如Tomcat或者Jetty、Undertow。
内嵌tomcat服务
【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】_第17张图片

4.1.2 ServletWebServerFactoryAutoConfiguration

  然后来看下ServletWebServerFactoryAutoConfiguration这个配置类。

【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】_第18张图片

  首先来看下在类的头部引入和一些核心的信息

【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】_第19张图片

重点我们需要看下EmbeddedTomcat这个内部类。

【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】_第20张图片

看到的核心其实是创建了一个TomcatServletWebServerFactory对象并注入到了Spring容器中。这块的内容非常重要,是我们后面串联的时候的一个切入点。

4.2 Tomcat启动流程

有了上面的自动配置类的支持我们就可以看看在SpringBoot的run方法中是在哪个位置帮我们内嵌了Tomcat容器呢?首先我们从SpringBoot的run方法的刷新上下文的方法进入。

【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】_第21张图片

这部分其实就是Spring的核心代码了,我们进入到onrefresh()方法。

【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】_第22张图片

继续进入:
【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】_第23张图片

然后我们进入ServletWebServerApplicationContext对象的onRefresh方法中。

【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】_第24张图片

核心方法 createWebServer() 创建我们的Tomcat容器

【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】_第25张图片

可以看到,从容器中获取的工厂对象其实就我们上面注入的对象,然后根据工厂对象获取到了一个TomcatWebServer实例,也就是Tomcat服务对象。关键点我们需要看下getWebServer方法的逻辑

【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】_第26张图片
Tomcat中获取getWebServer的相关方法
【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】_第27张图片

然后继续进入到 getTomcatWebServer方法中。

【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】_第28张图片

进入构造方法查看

【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】_第29张图片

进入Tomcat初始化的方法initialize方法

【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】_第30张图片

进入start方法,接下来的逻辑操作就是Tomcat自身启动的逻辑流程了

【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】_第31张图片
好了,关于【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】就先学习到这里,更多的内容持续创作学习中。
【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】_第32张图片

你可能感兴趣的:(SpringBoot,SpringBoot源码,Tomcat源码,编译部署Tomcat源码,内嵌Tomcat启动原理分析,Java)