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