在主程序中,使用了@SpringBootApplication
注解,它其实使用了@EnableAutoConfiguration
注解来完成一系列操作,@EnableAutoConfiguration
注解import了AutoConfigurationImportSelector
类,
它的构造函数实现了DeferredImportSelector
接口,
上一节,我们学习过Spring Boot2.0版本源码(八):Spring Boot的注解的解析出Bean之核心方法,里面的ConfigurationClassParser
类解析注解的核心方法中有一个processImports()
方法(该方法是在解析配置文件时调用),专门用于处理@Import
注解的一个方法,处理DeferredImportSelector
接口的在如下代码中实现。
handle方法会将当前的DeferredImportSelector
的实现类加入到deferredImportSelectors
这个需要处理的handler之中。
在解析完成以后,处理之前注入的deferredImportSelectorHandler
类中的集合
process()
源码如下:
下面的会使用getImports()
方法,在getImports()
方法内部会调用process()
方法
继续跟进,在getAutoConfigurationEntry()
方法内执行解析@EnableAutoConfiguration
注解的过程中,会注入一个org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration
类。
进入这个类,发现会将EmbeddedTomcat.class
这个类注入进来。
最后由EmbeddedTomcat
这个类引入了TomcatServletWebServerFactory
这个工厂类。
当这个工厂被注入以后,我们上一章Spring Boot2.0版本源码(九):Spring Boot的Servlet容器启动解析整体流程中讲过ServletWebServerApplicationContext
类中的refresh()
方法创建一个web容器,里面会用到tomcat工厂去去实现web容器的创建。