目录
2.ServletWebServerFactoryAutoConfiguration自动配置类
1.ServletWebServerFacotry注入
在启动tomcat时,会根据类型获取ServletWebServerFacotry类型的beanName,那么ServletWebServerFactory接口中是如何注入的呢?
2.ServletWebServerFactoryAutoConfiguration自动配置类
按照SpringBoot自动配置思想,应该是有一个beanNameAutConfiguration的自动配置类,全局搜索
ServletWebServerFactoryAutoConfiguration,果然是有的,但是如果需要这个自动配置类生效,需满足两个条件
2.1 必须存在ServletRequest类: @ConditionalOnClass(ServletRequest.class)
2.2 必须是Web应用:@ConditionalOnWebApplication(type = Type.SERVLET)
也就是说项目中引入了web servlet相关的依赖
3.自动配置类解析
如果上述两个条件符合,Spring就会加载解析该自动配置类,加载其自定义的一系列bean,如ServletWebServerFactoryCustomizer、TomcatServletWebServerFactoryCustomizer等,同时导入配置的类
3.1 导入ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar,实际上是注册了两个后置处理器WebServerFactoryCustomizerBeanPostProcessor(重点)和ErrorPageRegistrarBeanPostProcessor
调用后置处理器初始化前方法,如果是WebServerFactory类型,继续执行后置处理器初始化前方法
调用WebServerFactoryCustomizer的customize,实际就是ServletWebServerFactoryCustomizer的方法,完成相关web容器的初始化,如服务端口、服务地址等
3.2 导入ServletWebServerFactoryConfiguration.EmbeddedTomcat等,底层还有条件注解判断,根据条件判断注入哪个实现类(TomcatServletWebServerFactory、JettyServletWebServerFactory、UndertowServletWebServerFactory)
eg:截图是以注入TomcatServletWebServerFactory为例,其它两类似
4.难点解析
在导入这四个类时,实际的顺序和逻辑顺序有点绕,主要因为BeanPostProcessorsRegistrar它是一个bean定义注册器,它的核心作用是注册WebServerFactoryCustomizerBeanPostProcessor这个bean后置处理器,重写了初始化前方法postProcessBeforeInitialization,这样当Spring在初始化TomcatServletWebServerFactory等web应用容器bean之前会先执行重写了的初始化前方法,设置相关属性,达到自动注册的效果