001-Spring boot 启动内置Web容器分析

目录

    • 代码入口
      • 上下文容器
    • 加载web容器

代码入口

上下文容器

SpringApplication.run(App.class);
//追踪下去发现
context = createApplicationContext();

createApplicationContext()return this.applicationContextFactory.create(this.webApplicationType);

这里用了策略模式:
读取 interface org.springframework.boot.ApplicationContextFactory 的实现
根据 webApplicationType 匹配对应的处理
case : WebApplicationType.REACTIVE : return new AnnotationConfigReactiveWebServerApplicationContext();
case : WebApplicationType.SERVLET : return new AnnotationConfigServletWebServerApplicationContext();

然后就创建了:
org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext

webApplicationType 获取

//this.webApplicationType是在new SpringApplication()的时候赋值的
this.webApplicationType = WebApplicationType.deduceFromClasspath();

WebApplicationType.deduceFromClasspath():

if (classpath中 有 org.springframework.web.reactive.DispatcherHandler 
且 没有 org.springframework.web.servlet.DispatcherServlet 
且 没有 org.glassfish.jersey.servlet.ServletContainer) {
	return WebApplicationType.REACTIVE;
}

//有 spring-web的依赖则有
if (classpath中 没有 javax.servlet.Servlet) {
	return WebApplicationType.NONE;
}
if (classpath中 没有 org.springframework.web.context.ConfigurableWebApplicationContext) {
	return WebApplicationType.NONE;
}
return WebApplicationType.SERVLET;

加载web容器

首先我们知道了现在的上下文是AnnotationConfigServletWebServerApplicationContext
看一下依赖
001-Spring boot 启动内置Web容器分析_第1张图片

执行 org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext#onRefresh

org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext#createWebServer
来创建一个WebServer

你可能感兴趣的:(spring,boot,spring,boot,后端,java)