目录
- 代码入口
- 上下文容器
- 加载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
看一下依赖
执行 org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext#onRefreshorg.springframework.boot.web.servlet.context.ServletWebServerApplicationContext#createWebServer
来创建一个WebServer