互联网架构-Tomcat8深度源码分析-058:Tomcat8底层源码分析

1 Tomcat底层架构核心类源码分析

课程内容
1.如何完全dubug调试Tomcat8源码
2.两小时断点调试学会tomcat启动流程
3.使用嵌入Tomcat启动服务器
4.Tomcat8核心架构流程源码分析

2 Tomcat核心三大启动流程

Tomcat启动的时候
Init,初始化tomcat需要的组件(Connector、Service、Container、Wrapper) 空对象
Load,加载conf/server.xml到程序中
Start,启动tomcat,可能初始化servlet类(load-on-startup=1)
Stop,销毁操作

3 Catalina类实现包装核心常用组件

SpringBoot启动的流程:
1.tomcat本身是java语言编写的应用程序,在启动的时候入口为Bootstrap类main函数;
2.执行到Bootstrap类中的init方法,使用java的反射技术实例化Catalina类;
备注:Catalina实际就是一个包装类,包装了所有的tomcat核心组件(Connector、Service、Container、Wrapper)
在这里插入图片描述

4 基于责任链模式初始化Tomcat组件

3.执行Bootstrap函数中的load方法,再使用java的反射机制执行Catalina的load方法;
4.Catalina的load方法解析conf/server.xml配置文件,并且读取到程序中,再初始化server;
5.调用LifecycleBase类的init初始化server;
在这里插入图片描述
Server初始化流程
–Service 运行存在多个,负责tomcat业务逻辑操作
----Connector连接器 (主要负责监听客户端请求和封装请求和响应)
------Containet(容器)
--------host
----------context
------------Wrapper
tomcat初始化操作采用责任链设计模式

5 Tomcat启动是如何加载web

6.在ContextConfig 类中的webConfig方法解析项目的web.xml文件;
7.运行tomcat项目,判断项目中是否有web.xml,检查web.xml servlet配置,如果有的情况下,再开始初始化;

6 Tomcat8源码核心组件源码总结

StandardWrapper 指定WrapperServlet的类
StandardContext上下文,运行应用程序
Connector连接器,创建Socket连接,监听客户端请求

7 使用内嵌入tomcat启动服务

内嵌入tomcat启动
创建项目,添加archetypeCatalog=internal参数

Maven依赖

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.0.4.RELEASE</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-core</artifactId>
        <version>8.5.28</version>
    </dependency>
    <!-- Tomcat对jsp支持 -->
    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-jasper</artifactId>
        <version>8.5.16</version>
    </dependency>
</dependencies>

相关代码

@EnableWebMvc
@Configuration
@ComponentScan("com.mayikt.controller")
public class SpringMvcConfig {
}
public class WebInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(javax.servlet.ServletContext servletContext) throws ServletException {
        // 1.   创建SpringMVC容器
        AnnotationConfigWebApplicationContext app = new AnnotationConfigWebApplicationContext();
        // 2. 注册我们的配置文件
        app.register(SpringMvcConfig.class);
        // 注册我们的
        DispatcherServlet dispatcherServlet = new DispatcherServlet(app);
        ServletRegistration.Dynamic dynamic = servletContext.addServlet("dispatcherServlet", dispatcherServlet);
        dynamic.addMapping("/*");
        dynamic.setLoadOnStartup(1);// 最优先启动

    }
}
@RestController
public class IndexController {

    @RequestMapping("/")
    public String index(){
        return "mayikt";
    }
}
public class Tomcat8 {
    public static void main(String[] args) throws LifecycleException, ServletException {

        // 创建tomcat服务器
        Tomcat tomcatServer = new Tomcat();
        // 设定端口号
        tomcatServer.setPort(9090);
        // 设置上下文路径
        StandardContext ctx = (StandardContext) tomcatServer.addWebapp("/", new File("src/main").getAbsolutePath());
        // 禁止项目重入加载
        ctx.setReloadable(false);
        // 设置读取class文件地址
        File additionWebInfClasses = new File("target/classes");
        // 设置我们webRoot
        WebResourceRoot resources = new StandardRoot(ctx);
        resources.addPreResources(new DirResourceSet(resources, "/target/classes", additionWebInfClasses.getAbsolutePath(), "/"));
        // 开启我们的tomcat
        tomcatServer.start();
        // tomcat等待接受请求
        tomcatServer.getServer().await();
    }
}

运行结果:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值