SpringBoot Tomcat 启动原理
通过前几篇文章的阅读我们对SpringBoot的启动已经有所了解,但是Spring倒是是如何进行启动Tomcat的,我们酱紫啊本文解开它神奇的面纱;
起源 refresh()
@Override
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
prepareRefresh();
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
prepareBeanFactory(beanFactory);
try {
postProcessBeanFactory(beanFactory);
invokeBeanFactoryPostProcessors(beanFactory);
registerBeanPostProcessors(beanFactory);
initMessageSource();.
initApplicationEventMulticaster();
onRefresh();
registerListeners();
finishBeanFactoryInitialization(beanFactory);
finishRefresh();
}
catch (BeansException ex) {
if (logger.isWarnEnabled()) {
logger.warn("Exception encountered during context initialization - " +
"cancelling refresh attempt: " + ex);
}
destroyBeans();
cancelRefresh(ex);
throw ex;
}
finally {
resetCommonCaches();
}
}
}上面的源码想必大家都很熟,如果您还不是很了解,请阅读 SpringApplication源码解读以及 refresh源码解读
本次我们将讲解其中一个方法,onRefresh();官方的说明是这样的:初始化特定上下文子类中的其他特殊bean。这也是我们本文的重点,它就是启动Tomcat的关键所在 那么让我们来看一下他的源码:
追溯源码,我们发现,最终调用的是ServletWebServerApplicationContext中的onRefresh(),而其中的createWebServer();正式创建和启动Tomcat的所在方法 我们在来看一下createWebServer();的源码
我们可以发现当执行完 (1)处的代码时,所有的值还都全是
null当执行
getWebServerFactory();时,我们发现会创建一个ServletWebServerFactory首先我们来看一下ServletWebServerFactory源码
我们发现,ServletWebServerFactory有三个实现,类图如下,默认为Tomcat

这时我们来看一下getWebServer这个方法
通过上面的分析我们发现是getTomcatWebServer(tomcat);来启动Tomcat的,其实最终getTomcatWebServer 调用了TomcatWebServer 的initialize方法
这里我们会发现,开启后又会关闭资源,具体时为什么,我们来看看Tomcat的架构图 
一个服务器的基本功能:接收客户请求,解析请求,处理业务逻辑,结果返回给客户端。 一般有两个方法,star打开服务,监听端口;stop关闭服务,释放资源。 Tomcat也是一样的,只不过更复杂,功能更完善。 为什么Tomcat要分为这么多的组件呢?原因很简单:为了扩展。好像所有的多组件架构都是为了好扩展。 Connector负责请求监听,Container负责请求处理。server.xml配置了Connector与Container的对应关系,Service就包含了这种对应关系。 在Tomcat架构中,一个Server包含多个Service,每个Service包含多个Connector与一个Container,Container又有4种实现:Engine、Host、ontext、Wrapper。
通过上面的执行,Tomcat已经正常的启动,再由initPropertySources();进行资源初始化
如果您对Tomcat的感兴趣,点击这里 销书的pdf版本
Last updated