抛出疑问
springboot-starter是依靠spring.factories和spring-autoconfigure-metadata.properties来进行启动的. 那么springboot-starter-web是怎么搞的呢,我在下面并没有找到spring.factories?是怎么区分Jetty,Tomcat,Undertow的呢?又是怎么启动的呢?
溯源
-
spring-autoconfigure包下的spring.factories中有 ServletWebServerFactoryAutoConfiguration,
这个类是启动webServer的关键类:
- 引入了jetty,tomcat,undertow的Bean。
接下来这个Conditional就是classpath存在对应的类的时候加载对应的bean....于是乎我们大概懂了,当我们引入spring-starter-web 的时候,Tomcat.class就已经被引入了,所以这个bean就会被创建起来了~~~
-
那么快进到SpringBootApplication
-
这里返回的applicationContext是AnnotationConfigServletWebServerApplicationContext
-
再快进到 AbstractApplicationContext.refresh方法的onRefresh方法
-
ServletWebServerApplicationContext的onRefresh方法,创建webServer
-
这里的ServletWebServerFactory恰恰就是最上面的TomcatServletWebServerFactory...于是大概懂了是怎么整合的了