EmbeddedWebApplicationContext 的onRefresh方法
@Override protected void onRefresh() { super.onRefresh(); try { createEmbeddedServletContainer(); } catch (Throwable ex) { throw new ApplicationContextException("Unable to start embedded container", ex); } }
private void createEmbeddedServletContainer() { EmbeddedServletContainer localContainer = this.embeddedServletContainer; ServletContext localServletContext = getServletContext(); if (localContainer == null && localServletContext == null) { EmbeddedServletContainerFactory containerFactory = getEmbeddedServletContainerFactory(); this.embeddedServletContainer = containerFactory .getEmbeddedServletContainer(getSelfInitializer()); } …………………………………… initPropertySources(); }
这里有三个方法比较重要,
第一个是getEmbeddedServletContainerFactory,这个是去spring工厂获取注册的EmbeddedServletContainerFactory.class,servletContainer的工厂的注册是在
EmbeddedServletContainerAutoConfiguration,也是autoconfigure中注册的,里面根据jar包,判断是TomcatEmbeddedServletContainerFactory,JettyEmbeddedServletContainerFactory还是
UndertowEmbeddedServletContainerFactory,
第二个:TomcatEmbeddedServletContainerFactory的getEmbeddedServletContainer方法,是启动tomcat的核心,里面有实例化各个级别的容器,启动nio,连接servlet和tomcat和spring等
第三个:getSelfInitializer():返回的是一个实现了