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

獲取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);}
  • webServerFactoryCustomizerBeanPostProcessor實現了BeanPostProcessor,所以他會在啟動的時候調用postProcessBeforeInitialization方法 。
private void postProcessBeforeInitialization(WebServerFactory webServerFactory) {    // 找到WebServerFactoryCustomizer的Bean    LambdaSafe.callbacks(WebServerFactoryCustomizer.class, getCustomizers(), webServerFactory)        // 標記日志用的類        .withLogger(WebServerFactoryCustomizerBeanPostProcessor.class)        // 調用customize方法,傳入webServerFactory        .invoke((customizer) -> customizer.customize(webServerFactory));}
  • postProcessBeforeInitialization中會調用WebServerFactoryCustomizer類customize方法 , 在系統中的唯一實現:ServletWebServerFactoryCustomizer的customize方法 。
  • customize把配置中的內容設置到ConfigurableServletWebServerFactory對象中 。他的實現TomcatServletWebServerFactory在啟動的時候就會有值!
@Overridepublic void customize(ConfigurableServletWebServerFactory factory) {    PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();    map.from(this.serverProperties::getPort).to(factory::setPort);    map.from(this.serverProperties::getAddress).to(factory::setAddress);    map.from(this.serverProperties.getServlet()::getContextPath).to(factory::setContextPath);    map.from(this.serverProperties.getServlet()::getApplicationDisplayName).to(factory::setDisplayName);    map.from(this.serverProperties.getServlet()::isRegisterDefaultServlet).to(factory::setRegisterDefaultServlet);    map.from(this.serverProperties.getServlet()::getSession).to(factory::setSession);    map.from(this.serverProperties::getSsl).to(factory::setSsl);    map.from(this.serverProperties.getServlet()::getJsp).to(factory::setJsp);    map.from(this.serverProperties::getCompression).to(factory::setCompression);    map.from(this.serverProperties::getHttp2).to(factory::setHttp2);    map.from(this.serverProperties::getServerHeader).to(factory::setServerHeader);    map.from(this.serverProperties.getServlet()::getContextParameters).to(factory::setInitParameters);    map.from(this.serverProperties.getShutdown()).to(factory::setShutdown);    for (WebListenerRegistrar registrar : this.webListenerRegistrars) {        registrar.register(factory);    }    if (!CollectionUtils.isEmpty(this.cookieSameSiteSuppliers)) {        factory.setCookieSameSiteSuppliers(this.cookieSameSiteSuppliers);    }}ServletWebServerFactoryCustomizer這個Bean是哪里的?