目次
SPI
ホームページ Java &#&チュートリアル SpringBoot が Tomcat を統合する方法は何ですか?

SpringBoot が Tomcat を統合する方法は何ですか?

May 14, 2023 pm 07:43 PM
tomcat springboot

spring boot は、tomcat、jetty、undertow など、現在主流のサーブレット コンテナをサポートしており、これらのサーブレット コンテナはプロジェクトに簡単に統合できるため、開発や運用保守の負担が軽減されます。従来のアプリケーション開発には複雑な手順が必要です: tomcat をインストール –> tomcat 構成を変更 –> war パッケージをデプロイ –> tomcat を開始 –> 運用とメンテナンス... この作業負荷は小さくありません (特にクラスターの展開と移行の場合)アプリケーション。 Spring Boot を採用すると、パッケージング - java -jar - 運用と保守まで、jar パッケージを自由にデプロイしてインストールするだけで済み、すべてが非常にシンプルになります。

SPI

ソースコードを分析する前に、まず Spring の SPI メカニズムを理解しましょう。 jdk はアプリケーションの拡張を容易にするためにデフォルトの SPI 実装 (ServiceLoader) を提供しており、dubbo にも独自の SPI があることがわかっています。同じことが Spring にも当てはまります。これにより、開発者は META-INF/spring.factories ファイルを通じて拡張できる SpringFactoriesLoader が提供されます。理解しやすいように例を示します

ApplicationContextInitializer を Spring コンテナーに追加して初期化作業を行う場合は、Spring が提供する SPI 関数を使用してこの要件を完了できます。

まず、プロジェクト内に META-INF/spring.factories ファイルを作成します。ファイルの内容は次のとおりです:

org.springframework.context。 ApplicationContextInitializer= \

別のテスト ケースを作成すると、SPI を通じて定義した ApplicationContextInitializer を取得できます。非常に単純な関数のように見えますが、Spring Boot はこの強力な拡張ポイントを使用して、一般的に使用されるオープンソース フレームワークを Spring フレームワークに基づいて統合します。

@Test
public void testSpringSpi() {
    List<ApplicationListener> listeners = SpringFactoriesLoader.loadFactories( ApplicationListener.class, 
            ClassUtils.getDefaultClassLoader() );
    System.out.println( listeners );
ログイン後にコピー

これを見てみましょう SpringFactoriesLoader のキーコードは次のとおりです。 META-INF/spring.factories ファイルを読み込み、メソッドのパラメータで指定されたクラスを検索し、対応するインスタンス オブジェクトを作成して返します。さらに、並べ替えもサポートされており、次の方法で並べ替えることができます。

  • ##org.springframework.core.Ordered: このインターフェイスを実装します。

  • org .springframework.core.annotation.Order: Annotation

  • javax.annotation.Priority: Annotation

  • public static <T> List<T> loadFactories(Class<T> factoryClass, ClassLoader classLoader) {
        List<String> factoryNames = loadFactoryNames(factoryClass, classLoaderToUse);
        List<T> result = new ArrayList<T>(factoryNames.size());
        for (String factoryName : factoryNames) {
            result.add(instantiateFactory(factoryName, factoryClass, classLoaderToUse));
        }
        AnnotationAwareOrderComparator.sort(result);
        return result;
    ログイン後にコピー
次に、Spring How を分析しましょうboot は SPI メカニズムを使用して tomcat を統合します

Tomcat 用 SpringBoot

Tomcat 統合のソース コードを分析する前に、まず EmbeddedServletContainer

EmbeddedServletContainer:

Spring は

EmbeddedServletContainer を使用して埋め込みサーブレット コンテナをカプセル化し、コンテナのライフ サイクルを制御するための startstop およびその他のインターフェイスを提供します。クラス図に示されている tomcat 、jetty、undertow コンテナーの実装

スプリング ブートで最も一般的に使用される

SpringBootApplication アノテーションを見てみましょう。この EnableAutoConfiguration は自動構成のために Spring Boot によって使用されるアノテーションです。

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
        @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
        @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
    // code......
ログイン後にコピー

spring-boot-autoconfigure で多数の SPI 構成を確認できます。モジュールの一部は次のとおりです

# Auto Configure

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration,\

オリジナルの

EnableAutoConfiguration アノテーションは EmbeddedServletContainerAutoConfiguration を導入しており、これは組み込みサーブレット コンテナの構成クラスです。Tomcat、jetty、および undertow はすべてこのクラスにあります、@ConditionalOnClassAnnotation を通じて、さまざまなサーブレット コンテナがロードされます。ただし、このクラスは TomcatEmbeddedServletContainerFactory を登録するだけであり、すべての混乱を解決するには十分ではありません。心配しないで、まず TomcatEmbeddedServletContainerFactory のクラス図を見てみましょう。

上記のクラス図からわかるように、次のインターフェイスを実装します。

  • EmbeddedServletContainerFactory:

    EmbeddedServletContainer## を作成するために使用されるファクトリ パターンです。 #、つまり、埋め込みサーブレット コンテナを作成するために使用されます。このインターフェイスには getEmbeddedServletContainer メソッドが 1 つだけあります。

    ConfigurableEmbeddedServletContainer:
  • の構成に使用されます。 EmbeddedServletContainer
  • (ポート、コンテキスト パスなどについての話)

    #上記 2 つのインターフェイスを分析した結果、サーブレット コンテナの作成作業は # によって完了したことがわかります。 ##EmbeddedServletContainerFactory
getEmbeddedServletContainer

メソッド呼び出しスタックを見てください。 GenericWebApplicationContext#onRefresh() メソッドが EmbeddedWebApplicationContext に書き換えられ、getEmbeddedServletContainer メソッドが呼び出されてサーブレット コンテナが作成されます。次に、この作成プロセスを分析します。 主要なコードは次のとおりです (例外処理は省略): <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>EmbeddedWebApplicationContext.java @Override protected void onRefresh() { super.onRefresh(); createEmbeddedServletContainer(); } private void createEmbeddedServletContainer() { EmbeddedServletContainer localContainer = this.embeddedServletContainer; ServletContext localServletContext = getServletContext(); if (localContainer == null &amp;&amp; localServletContext == null) { // 从容器中获取bean,如果使用tomcat则返回TomcatEmbeddedServletContainerFactory EmbeddedServletContainerFactory containerFactory = getEmbeddedServletContainerFactory(); this.embeddedServletContainer = containerFactory.getEmbeddedServletContainer(getSelfInitializer()); } else if (localServletContext != null) { getSelfInitializer().onStartup(localServletContext); } initPropertySources();</pre><div class="contentsignin">ログイン後にコピー</div></div>最初にメイン フローチャートを作成しましょう

SpringBoot が Tomcat を統合する方法は何ですか?

由上图可知,EmbeddedWebApplicationContext在执行onRefresh方法的时候,首先调用父类的onRefresh,然后从容器中获取EmbeddedServletContainerFactory的实现类。由于我们在 classpath 下面可以获取 tomcat 的 jar 包,因此EmbeddedServletContainerAutoConfiguration会在 spring 容器中注册TomcatEmbeddedServletContainerFactory这个 bean。然后,由它创建TomcatEmbeddedServletContainer,我们来看看具体的创建过程,代码如下所示:

TomcatEmbeddedServletContainerFactory.java
@Override
public EmbeddedServletContainer getEmbeddedServletContainer(
        ServletContextInitializer... initializers) {
    Tomcat tomcat = new Tomcat();   // 实例化 apache Tomcat 
    File baseDir = (this.baseDirectory != null ? this.baseDirectory
            : createTempDir("tomcat"));
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    // 创建 Connector 组件,默认使用org.apache.coyote.http11.Http11NioProtocol
    Connector connector = new Connector(this.protocol); 
    tomcat.getService().addConnector(connector);
    // 支持对 Connector 进行自定义设置,比如设置线程池、最大连接数等
    customizeConnector(connector);
    tomcat.setConnector(connector);
    tomcat.getHost().setAutoDeploy(false);
    configureEngine(tomcat.getEngine());
    for (Connector additionalConnector : this.additionalTomcatConnectors) {
        tomcat.getService().addConnector(additionalConnector);
    }
    prepareContext(tomcat.getHost(), initializers);
    return getTomcatEmbeddedServletContainer(tomcat);
ログイン後にコピー

首先是实例化Tomcat对象,然后创建Connector组件,并且对Connector进行相关的参数设置,同时也允许我们通过TomcatConnectorCustomizer接口进行自定义的设置。OK,创建了Tomcat实例之后,需要创建TomcatEmbeddedServletContainer,它依赖Tomcat对象,在构造方法中便会启动 Tomcat 容器,从而完成各个组件的启动流程

public TomcatEmbeddedServletContainer(Tomcat tomcat, boolean autoStart) {
    Assert.notNull(tomcat, "Tomcat Server must not be null");
    this.tomcat = tomcat;
    this.autoStart = autoStart;
    initialize();
}
private void initialize() throws EmbeddedServletContainerException {
    synchronized (this.monitor) {
        addInstanceIdToEngineName();
        // Remove service connectors to that protocol binding doesn&#39;t happen yet
        removeServiceConnectors();
        // Start the server to trigger initialization listeners
        this.tomcat.start();
        // We can re-throw failure exception directly in the main thread
        rethrowDeferredStartupExceptions();
        Context context = findContext();
        ContextBindings.bindClassLoader(context, getNamingToken(context),
                    getClass().getClassLoader());
        // Unlike Jetty, all Tomcat threads are daemon threads. We create a
        // blocking non-daemon to stop immediate shutdown
        startDaemonAwaitThread();
    }
ログイン後にコピー

以上がSpringBoot が Tomcat を統合する方法は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Tomcat に jar プロジェクトをデプロイする方法 Tomcat に jar プロジェクトをデプロイする方法 Apr 21, 2024 am 07:27 AM

JAR プロジェクトを Tomcat にデプロイするには、次の手順に従います。 Tomcat をダウンロードして解凍します。 server.xml ファイルを構成し、ポートとプロジェクトのデプロイメント・パスを設定します。 JAR ファイルを指定されたデプロイメント パスにコピーします。 Tomcatを起動します。指定された URL を使用して、デプロイされたプロジェクトにアクセスします。

Tomcat サーバーへの外部ネットワーク アクセスを許可する方法 Tomcat サーバーへの外部ネットワーク アクセスを許可する方法 Apr 21, 2024 am 07:22 AM

Tomcat サーバーが外部ネットワークにアクセスできるようにするには、以下を行う必要があります。 外部接続を許可するように Tomcat 構成ファイルを変更します。 Tomcat サーバー ポートへのアクセスを許可するファイアウォール ルールを追加します。 Tomcat サーバーのパブリック IP を指すドメイン名を指す DNS レコードを作成します。オプション: リバース プロキシを使用して、セキュリティとパフォーマンスを向上させます。オプション: セキュリティを強化するために HTTPS を設定します。

Tomcatのインストールディレクトリはどこにありますか? Tomcatのインストールディレクトリはどこにありますか? Apr 21, 2024 am 07:48 AM

Tomcat インストール ディレクトリ: デフォルト パス: Windows: C:\Program Files\Apache Software Foundation\Tomcat 9.0macOS:/Library/Tomcat/Tomcat 9.0Linux:/opt/tomcat/tomcat9 カスタム パス: インストール中に指定できます。インストール ディレクトリを見つけます。whereis またはlocateコマンドを使用します。

Tomcat で複数のプロジェクトをデプロイする方法 Tomcat で複数のプロジェクトをデプロイする方法 Apr 21, 2024 am 09:33 AM

Tomcat を介して複数のプロジェクトをデプロイするには、プロジェクトごとに webapp ディレクトリを作成してから、次の操作を行う必要があります。 自動デプロイ: webapp ディレクトリを Tomcat の webapps ディレクトリに配置します。手動デプロイメント: Tomcat のマネージャー アプリケーションにプロジェクトを手動でデプロイします。プロジェクトがデプロイされると、そのデプロイメント名 (例: http://localhost:8080/project1) でアクセスできるようになります。

Tomcatでの同時接続数を確認する方法 Tomcatでの同時接続数を確認する方法 Apr 21, 2024 am 08:12 AM

Tomcat の同時接続数を確認する方法: Tomcat Manager ページ (http://localhost:8080/manager/html) にアクセスし、ユーザー名とパスワードを入力します。左側のナビゲーション バーで [ステータス] -> [セッション] をクリックすると、ページの上部に同時接続数が表示されます。

Tomcat Web サイトのルート ディレクトリはどこですか? Tomcat Web サイトのルート ディレクトリはどこですか? Apr 21, 2024 am 09:27 AM

Tomcat Web サイトのルート ディレクトリは Tomcat の webapps サブディレクトリにあり、Web アプリケーション ファイル、静的リソース、および WEB-INF ディレクトリを保存するために使用されます。これは、Tomcat 構成ファイルで docBase 属性を検索することで見つかります。

Tomcatのポート番号を確認する方法 Tomcatのポート番号を確認する方法 Apr 21, 2024 am 08:00 AM

Tomcat のポート番号は、server.xml ファイルの <Connector> 要素の port 属性を確認することで確認できます。 Tomcat 管理インターフェイス (http://localhost:8080/manager/html) にアクセスし、[ステータス] タブを表示します。コマンドラインから「catalina.sh version」を実行し、「Port:」行を確認します。

Tomcatでドメイン名を設定する方法 Tomcatでドメイン名を設定する方法 Apr 21, 2024 am 09:52 AM

ドメイン名を使用するように Tomcat を構成するには、次の手順に従います。 server.xml バックアップを作成します。 server.xml を開いて Host 要素を追加し、example.com をドメイン名に置き換えます。ドメイン名の SSL 証明書を作成します (必要な場合)。 server.xml に SSL コネクタを追加し、ポート、キーストア ファイル、およびパスワードを変更します。 server.xml を保存します。 Tomcatを再起動します。

See all articles