这里写目录标题
调用链路
AnnotationConfigServletWebServerApplicationContext |
---|
ServletWebServerApplicationContext#onRefresh |
GenericWebApplicationContext#onRefresh#onRefresh |
核心源码
- 创建tomcat服务器
protected void onRefresh() {
super.onRefresh();
try {
createWebServer();
}
catch (Throwable ex) {
throw new ApplicationContextException("Unable to start web server", ex);
}
}
- 创建tomcat
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = getServletContext();
if (webServer == null && servletContext == null) {
ServletWebServerFactory factory = getWebServerFactory();
创建tomcat 构建内部组件关系
this.webServer = factory.getWebServer(getSelfInitializer());
}
else if (servletContext != null) {
try {
getSelfInitializer().onStartup(servletContext);
}
catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context",
ex);
}
}
initPropertySources();
}
- 构建tomcat,设置连接器
- 设置service
- 设置Engine容器
- 简介tomcat:一个server服务器有多个service服务,每个service可以有多个连接器,一个连接器一般代表一个协议[http,ajp]连接通道,一个service只能有一个容器,一个容器可以有多个子容器[engine-host-context-wrapper],engine为顶级容器,参见tomcat专栏[待出]
public WebServer getWebServer(ServletContextInitializer... initializers) {
Tomcat tomcat = new Tomcat();
File baseDir = (this.baseDirectory != null) ? this.baseDirectory
: createTempDir("tomcat");
tomcat.setBaseDir(baseDir.getAbsolutePath());
Connector connector = new Connector(this.protocol);
tomcat.getService().addConnector(connector);
customizeConnector(connector);
tomcat.setConnector(connector);
tomcat.getHost().setAutoDeploy(false);
configureEngine(tomcat.getEngine());
for (Connector additionalConnector : this.additionalTomcatConnectors) {
tomcat.getService().addConnector(additionalConnector);
}
prepareContext(tomcat.getHost(), initializers);
return getTomcatWebServer(tomcat);
}
总结
- onRefresh主要覆写了父类的方法,从而完成了嵌入式tomcat初始化