【Spring boot】整合tomcat底层原理( 三 )

  • 这个方法会调用createWebServer()方法 。
// 最核心的俩行代码private void createWebServer() {    ......    // 获取web容器,多个或者没有的时候报错    ServletWebServerFactory factory = getWebServerFactory();    // 调用这个容器的getWebServer方法,上面的启动tomcat的方法!    this.webServer = factory.getWebServer(getSelfInitializer());    ......}
  • getWebServerFactory控制项目组有且只能有一个web容器!
protected ServletWebServerFactory getWebServerFactory() {    // Use bean names so that we don't consider the hierarchy    // 得到所有类型为ServletWebServerFactory的Bean 。TomcatServletWebServerFactory、JettyServletWebServerFactory、UndertowServletWebServerFactory都是他得到子类!    String[] beanNames = getBeanFactory().getBeanNamesForType(ServletWebServerFactory.class);    // 不存在,报错    if (beanNames.length == 0) {        throw new ApplicationContextException("Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.");    }    // 存在不止一个,报错!    if (beanNames.length > 1) {        throw new ApplicationContextException("Unable to start ServletWebServerApplicationContext due to multiple ServletWebServerFactory beans : " + StringUtils.arrayToCommaDelimitedString(beanNames));    }    // 返回唯一的一个web容器!    return getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);}获取tomcat的配置
  • 自动配置类ServletWebServerFactoryAutoConfiguration上除了import三个web容器,还import了BeanPostProcessorsRegistrar 。
  • BeanPostProcessorsRegistrar实现了ImportBeanDefinitionRegistrar,所以他会在spring启动的时候调用registerBeanDefinitions方法 。
  • registerBeanDefinitions会注册一个Bean:webServerFactoryCustomizerBeanPostProcessor 。
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {    // Bean工厂,一个Aware回调进行赋值    if (this.beanFactory == null) {        return;    }    // 注册webServerFactoryCustomizerBeanPostProcessor这个Bean 。    registerSyntheticBeanIfMissing(registry, "webServerFactoryCustomizerBeanPostProcessor",        WebServerFactoryCustomizerBeanPostProcessor.class,        WebServerFactoryCustomizerBeanPostProcessor::new);    // 注册errorPageRegistrarBeanPostProcessor    registerSyntheticBeanIfMissing(registry, "errorPageRegistrarBeanPostProcessor",        ErrorPageRegistrarBeanPostProcessor.class, ErrorPageRegistrarBeanPostProcessor::new);}