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ファクトリコンポーネントを生成するタスクです.
まず、この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というクラス
このクラスはtomcat関連jarパッケージが存在する場合にTomcatServertWebServerFactory beanを追加します
5.それ以外に注入した
埋め込み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