- 1. spring.factories文件
- 2. 获取ServletWebServerFactory
- 3. 总结
首先当Springboot启动的时候SpringApplication对象,在这里面会加载所有的spring.factories文件,所有配置类的命名空间保存起来,等到需要使用的时候进行实例化。其中这里面就包括配置Tomcat的配置类。ServletWebServerFactoryAutoConfiguration
2. 获取ServletWebServerFactory当Springboot判断你要启动web项目是,会创建一个ServletWebServerApplicationContext作为Spring的上下文,在这个对面的refreh()方法里面会获取ServletWebServerFactory用来创建一个web容器。
这里会通过getWebServerFactory()去创建一个工厂,然后通过工厂去获取一个web容器
到这里,我们可以发现springboot是从beanFactory里面获取一个ServletWebServerFactory类型的bean对象,那么这个bean对象是怎么被加载到Spring的ioc容器中的呢?其实源头就是我们上面说的spring.factories文件中。
在这个jar包里面的spring.factories文件里面有一个AutoConfig类,在这里面有ServletWebServerFactory类型Bean的线索
我们可以看到这个AutoConfiguation类里面@import了很多东西,我们就点进这个EmbeddedTomcat.class
在这里面就发现了一个关键Bean,TomcatServletWebServerFactory,这个Bean在创建web容器之前就已经注入到Spring Ioc容器中,所以可以直接获取然后用来创建Tomcat容器。
现在我们已经知道ServletWebServerFactory是怎么被创建出来的了接着我们回到之前源码里继续看,
到这里,已经完全清晰了,直接去构造一个Tomcat对象,然后对其进行配置,最后包装一下返回,放入Spring上下文中。
至此我们已经把SpringBoot内置Tomcat的创建流程串起来了,我们其实可以发现Springboot的原理,以及第三方框架集成Springboot的原理。其实就是将需要配置的类配置到spring.factores文件中,等某个时机SpringBoot将其加载出来,然后通过调用被@Bean注解标注的方法去实例化Bean对象,然后将其放入SpringApplicationContext或者ioc容器(其实就是BeanFactory)中,等所有bean加载成功之后依赖于Spring框架对他们进行依赖注入。最后完成Spirng容器的启动、Web容器的启动、第三方框架的初始化。



