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();
}
}
运行结果: