Springbootが起動すると、最初にSpringApplicationオブジェクトが初期化されます。具体的な呼び出しプロセスは次のとおりです。
上記の呼び出しメソッドから、プログラムが実行されると、SpringApplicationのコンストラクターが最初に呼び出されてSpringApplicationオブジェクトが作成され(図3)、具体的な実装が図5に示されていることがわかります。
【WebApplicationType】
SpringApplicationコンストラクターを選び出します(図5)。このコードの黄色いボックスは、プログラムのアプリケーションタイプ(webApplicationType)を示しています。
SpringApplicationプロパティのオブジェクトタイプWebApplicationTypeを見つけます。
次に、そのソースコードを開いて、オブジェクトが列挙型であり、3つの列挙値、つまりNONE、SERVLET、およびREACTIVEが定義されていることを確認します。
次の3つの列挙値が導入されています:
無し | アプリケーションをWebアプリケーションとして実行したり、組み込みWebサーバーを起動したりしないでください。 |
サーブレット | アプリケーションはサーブレットベースのWebアプリケーションとして実行し、組み込みサーブレットWebサーバーを起動する必要があります。 |
反応性 | アプリケーションはリアクティブWebアプリケーションとして実行する必要があり、組み込みのリアクティブWebサーバーを起動する必要があります。 |
その意味するところは、Springbootプロジェクトには3つのタイプのプログラムがあるということです。
(1)非Webアプリケーション(組み込みサーバーなし)。
(2)組み込みサーブレットベースのWebサーバー(Tomcat、Jetty、Undertowなど。実際、ほとんどのJava Webサイトアプリケーションは現在、Tomcatベースのサーブレットタイプのサーバーを使用しています)。
(3)組み込みのリアクティブWebサーバー(例:Netty)。
サーブレットコンテナでは、命令型プログラミング方式が使用され、コードは文ごとに実行されます。これは、理解とデバッグに役立ちますが、リアクティブWebプログラミングでは、非同期応答に基づいており、WebFluxフレームワークは次のようになります。より人気のあるリアクティブプログラミング。
3種類のSpringbootアプリケーションがわかったので、彼は現在のプログラムの種類をどのように判断しますか?
【WebApplicationType.deduceFromClasspath()方法】
アプリケーションタイプを割り当てたばかりのコードに戻ると、WebApplicationType.deduceFromClasspath()メソッドが表示されます。
このメソッドの実装ソースコードを開きます。ここでは、取得した3つのアプリケーションタイプのコードを確認できます。
【ClassUtils.isPresent()
このメソッドでは、繰り返しメソッドはClassUtils.isPresent()です。ここで、パラメーターはパッケージパスのクラス名です。では、この方法は何をするのでしょうか?引き続き確認してみましょう。
最初にStudentクラスを作成し、次にClassUtils.isPresent()メソッドを呼び出し、最後にメソッドがtrueを返すことを確認します。
ここで、パラメーターを存在しないクラス名Student2に変更し、それがfalseであることがわかります。
したがって、次の結論を導き出すことができます。
ClassUtils.isPresent()メソッドは、クラスの存在を判断するために使用されます。クラスが存在する場合、返される結果はtrueです。クラスが存在しない場合、返される結果はfasleです。
【まとめ】
したがって、ソースコードに戻り、定数の定義と組み合わせてSpringbootアプリケーションのタイプを判断することは難しくありません。
次のように要約します。
(1)DispatcherHandlerクラスがプロジェクトに存在し、DispatcherServletクラスとServletContainerが存在しない場合、プログラムのアプリケーションタイプはREACTIVEです。つまり、リアクティブWebサーバーをロードして埋め込みます。
(2)サーブレットとConfigurableWebApplicationContextのいずれかがプロジェクトに存在しない場合、プログラムのアプリケーションタイプはNONEであり、組み込みWebサーバーをロードしません。
(3)上記の2つの場合を除いて、残りはSERVLETタイプに従って処理され、サーブレットタイプのWebサーバーが組み込まれます。
上記のクラスの決定はSpringの関連する依存関係パッケージに基づいており、依存関係パッケージをインポートする必要があるかどうかも開発者が決定するため、開発者はSrpingboot自体ではなくプログラムのアプリケーションタイプを決定できます。
最後に、写真が添付されています。