SpringBoot2.x内蔵Tomcat自動構成原理

7998 ワード

SpringBootに埋め込まれているtomcatはどのように自動的に構成されていますか?
埋め込みtomcatのデフォルトパラメータをどのように変更しますか?
この2つの問題を持ってSpringBootの内蔵tomcat自動構成原理を分析した.
SpringBootの自動構成はspring-boot-autoconfigure-xxにあることを知っています.RELEASE.jarパッケージ下.
同時にSpringBootはサポートされているservlet webサーバの実装をモデリング抽象化した.
 
サーブレットコンテナタイプ
WebServerモデルインタフェース
WebServerファクトリ実装クラス
Tomcat   
TomcatWebServer 
   TomcatServletWebServerFactory
Jetty  
 JettyWebServer   
JettyServletWebServerFactory
Undertow 
UndertowWebServer 
UndertowServletWebServerFactory
このモデルの概念に基づいて、Springbootは、Webアプリケーションの1つで、上記のWebファクトリコンポーネントを使用して対応するWebサーバインスタンスを生成します.Webファクトリコンポーネントはどこから来たのか、これが自動構成クラスS e r t e W e b ServerFactoryAutoConfiguarationが自動構成してこのWebファクトリコンポーネントを生成するタスクです.
    
@Configuration
@AutoConfigureOrder(-2147483648)
@ConditionalOnClass({ServletRequest.class})
@ConditionalOnWebApplication(
    type = Type.SERVLET
)
@EnableConfigurationProperties({ServerProperties.class})
@Import({ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class, EmbeddedTomcat.class, EmbeddedJetty.class, EmbeddedUndertow.class})
public class ServletWebServerFactoryAutoConfiguration {
    public ServletWebServerFactoryAutoConfiguration() {
    }

    @Bean
    public ServletWebServerFactoryCustomizer servletWebServerFactoryCustomizer(ServerProperties serverProperties) {
        return new ServletWebServerFactoryCustomizer(serverProperties);
    }

    @Bean
    @ConditionalOnClass(
        name = {"org.apache.catalina.startup.Tomcat"}
    )
    public TomcatServletWebServerFactoryCustomizer tomcatServletWebServerFactoryCustomizer(ServerProperties serverProperties) {
        return new TomcatServletWebServerFactoryCustomizer(serverProperties);
    }

    public static class BeanPostProcessorsRegistrar implements ImportBeanDefinitionRegistrar, BeanFactoryAware {
        private ConfigurableListableBeanFactory beanFactory;

        public BeanPostProcessorsRegistrar() {
        }

        public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
            if (beanFactory instanceof ConfigurableListableBeanFactory) {
                this.beanFactory = (ConfigurableListableBeanFactory)beanFactory;
            }

        }

        public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
            if (this.beanFactory != null) {
                this.registerSyntheticBeanIfMissing(registry, "webServerFactoryCustomizerBeanPostProcessor", WebServerFactoryCustomizerBeanPostProcessor.class);
                this.registerSyntheticBeanIfMissing(registry, "errorPageRegistrarBeanPostProcessor", ErrorPageRegistrarBeanPostProcessor.class);
            }
        }

        private void registerSyntheticBeanIfMissing(BeanDefinitionRegistry registry, String name, Class> beanClass) {
            if (ObjectUtils.isEmpty(this.beanFactory.getBeanNamesForType(beanClass, true, false))) {
                RootBeanDefinition beanDefinition = new RootBeanDefinition(beanClass);
                beanDefinition.setSynthetic(true);
                registry.registerBeanDefinition(name, beanDefinition);
            }

        }
    }
}

まず、このS v e r t e W e b S e rverFactoryAutoConfiguration自動構成クラスのいくつかの注記を見てみましょう.
2つのConditionは、現在の実行環境がservlet標準仕様に基づくウェブサービスであることを示す:ConditionalOnClass(サーブレットRequest.class):現在servlet-api依存が必要であることを示すConditionalOnWebApplication(type=Type.SERVLET):servletのみに基づくWebアプリケーション
 
1.@AutoConfigureOrderこの注釈は構成クラスのロード順序を決定し、注釈の値が小さいほど先にロードする
2.@EnableConfigurationPropertiesは、Server Propertiesクラスの属性値構成を開きます.このクラスにはwebserverの構成が含まれています
3.@Import内部クラスBeanPostProcessorsRegistrar、このクラスには2つのbeanが登録されています.
WebServerFactoryCustomizerBeanPostProcessorとErrorPageRegistarBeanPostProcess.この2つのbeanの役割については後述する
4.@Import EmbeddedTomcatというクラス
   
 @Configuration
    @ConditionalOnClass({Servlet.class, Tomcat.class, UpgradeProtocol.class})
    @ConditionalOnMissingBean(
        value = {ServletWebServerFactory.class},
        search = SearchStrategy.CURRENT
    )
    public static class EmbeddedTomcat {
        public EmbeddedTomcat() {
        }

        @Bean
        public TomcatServletWebServerFactory tomcatServletWebServerFactory() {
            return new TomcatServletWebServerFactory();
        }
    }

このクラスはtomcat関連jarパッケージが存在する場合にTomcatServertWebServerFactory beanを追加します
5.それ以外に注入した
ServletWebServerFactoryCustomizer TomcatServletWebServerFactoryCustomizer