概要概要
SpringBootは、2013年にPivotalチームによって開発された新しいオープンソースの軽量フレームワークであり、最初のバージョンは2014年4月にリリースされました。これはSpring4.0に基づいて設計されており、Springフレームワークの元の優れた機能を継承するだけでなく、構成を簡素化することでSpringアプリケーションの構築および開発プロセス全体をさらに簡素化します。さらに、SpringBootは多数のフレームワークを統合しているため、依存パッケージのバージョンの競合と参照の不安定性が十分に解決されています。
Spring Bootを使用したことがある人は、プロジェクトのスタートアップエントリのメインクラスのmain()メソッドに簡単な文があることを知っておく必要があります。
SpringApplication.run( ... );
これにより、プロジェクトを開始する道が開かれました。
したがって、この記事では、このSpringApplicationおよびrun()メソッドとは何であり、その背後に隠されている謎は何であるかを見ていきます。
SpringApplication
元のSpringフレームワークにはこのクラスがないため、SpringApplicationクラスはSpring Bootフレームワーク自体の「革新的な」製品と見なす必要があります。SpringApplicationは一連のSpringアプリケーション起動プロセスをカプセル化しますが、これはユーザーに対して完全に透過的です。 Springを使い始める起動時はシンプルで軽量です。
一般的に、デフォルトのSpringApplication実行プロセスはすでにほとんどのニーズを満たすことができますが、ユーザーがこのプロセスに介入したい場合は、プロセスの一部でSpringApplicationによって開かれた拡張ポイントを介してプロセスを拡張できます。一般的な拡張スキームsetメソッドを使用することです。
例を挙げて、私たちが毎日慣れているSpringBootアプリケーションのスタートアップクラスを逆アセンブルして書き出しましょう。
@SpringBootApplication
public class FrontNovelApplication {
public static void main(String[] args) {
// 这是传统Spring Boot应用的启动,一行代码搞定,内部默认做了很多事
SpringApplication.run(FrontNovelApplication.class);
// 用户自定的扩展在此 !!!
SpringApplication app = new SpringApplication(FrontNovelApplication.class);
//app.setXXX();这里能做很多自定义的事情。
app.setBanner((environment, sourceClass, out) -> out.println(100));
app.run(args);
}
このような逆アセンブルの後、最初にSpringApplicationクラスオブジェクトを作成してから、オブジェクトのrun()メソッドを呼び出す必要があることがわかりました。
次に、SpringApplicationの構築プロセスとそのrun()メソッドのプロセスについて説明します。これが明確であれば、SpringBootアプリケーションがどのように実行されるかは明らかです。
SpringApplicationインスタンスの初期化
最初にコードを見てみましょう:
図の赤いボックスは、次のように説明される4つの主要なステップを示しています。
①アプリケーションの種類を推測する:REACTIVEアプリケーション、SERVLETアプリケーション、NONEのいずれかを作成します
②SpringFactoriesLoaderを使用して、クラスパスの下のMETA-INF /spring.factoriesファイルで使用可能なすべてのApplicationContextInitializersを見つけてロードします。
③SpringFactoriesLoaderを使用して、クラスパスの下のMETA-INF /spring.factoriesファイルで使用可能なすべてのApplicationListenerを検索してロードします。
④mainメソッドの定義クラスを推測して設定する
SpringApplicationのrun()メソッドの調査
まず、コードがどのように見えるかを見てください。
次のように手順を要約して改良します。
1.SpringFactoriesLoaderを介してMETA-INF / spring.factoriesファイルをロードし、SpringApplicationRunListenerオブジェクトを取得して作成します
2.次に、SpringApplicationRunListenerが開始メッセージを送信します
3.パラメータを作成し、現在のSpringBootアプリケーションが使用する環境を構成します
4.完了後も、environmentPreparedメッセージはSpringApplicationRunListenerによって送信されます。
5.ApplicationContextを作成します
6. ApplicationContextの初期化、環境の設定、関連する構成のロードなど。
7. contextPreparedメッセージがSpringApplicationRunListenerによって送信され、SpringBootアプリケーションで使用されるApplicationContextの準備ができたことを通知します。
8.さまざまなBeanをApplicationContextにロードし、SpringApplicationRunListenerによってcontextLoadedメッセージを送信し続けて、SpringBootアプリケーションで使用されるApplicationContextがOKで満たされていることをSpringBootアプリケーションに通知します。
9. ApplicationContextを更新し、IoCコンテナで利用可能な最後のステップを完了します
10.開始メッセージはSpringApplicationRunListenerによって送信されます
11. callRunners(...)メソッドを呼び出して、ApplicationRunnerおよびCommandLineRunnerインターフェイスクラスを実装するrunメソッドを実行します。これは、Springアプリケーションコンテキストの準備後にいくつかの追加操作を実行するために使用されます。最終プログラムの開始を完了するために。
12.実行中のメッセージは、プログラムが実行中であることを通知するためにSpringApplicationRunListenerによって送信されます。
この時点で、プロセス全体が終了します。