ホームページ  >  記事  >  Java  >  SpringBootアプリケーションの起動エントリをカプセル化する方法

SpringBootアプリケーションの起動エントリをカプセル化する方法

WBOY
WBOY転載
2023-05-13 10:28:211391ブラウズ

SpringBootアプリケーションの起動エントリをカプセル化する方法

Springboot は Java プログラマーにとって必要なスキルであると言えます。Springboot は最終的には Maven を介して jar パッケージにパッケージ化され、java - を直接使用できることは誰もが知っています。 jar コマンド Web プロジェクト (またはその他) を実行します。これにより、元の Tomcat ベースの Web プロジェクトの複雑な操作が回避されます。 Springboot には Jetty (または Tomcat) サーバーが組み込まれており、コンテナーの起動プロセス中にサーバーを起動して Web サービスを正常に実行できるため、Web サービスのデプロイメントが非常に簡単になります。

すべての Springbooter は次のコードに精通していると思いますが、Springboot を学習している新入生であれ、Springboot ソース コードの学習を始めた新しいドライバーであれ、このコードはほぼ出発点です。私たちはそれをよく知っているので、それが魔法の楽園 Springboot の出発点であると考えています。しかし、本当にそうなのでしょうか?

 @SpringBootApplication
 public class Springboot01helloworldApplication {
     public static void main(String[] args) {
         SpringApplication.run(Springboot01helloworldApplication.class, args);
     }
 }

Java プロジェクトがパッケージ化された後、jar パッケージのエントリの説明が /META-INF/MANIFEST.MF ファイルに書き込まれることは誰もが知っています。このファイルの内容:

 Manifest-Version: 1.0
 Archiver-Version: Plexus Archiver
 Built-By: MrXu
 Start-Class: com.vivo.internet.nex.repeater.console.RepeaterConsoleApplication
 Spring-Boot-Classes: BOOT-INF/classes/
 Spring-Boot-Lib: BOOT-INF/lib/
 Spring-Boot-Version: 1.5.19.RELEASE
 Created-By: Apache Maven 3.8.1
 Build-Jdk: 1.8.0_281
 Main-Class: org.springframework.boot.loader.JarLauncher

ファイル エントリの説明は、Main-Class に対応する値、つまり org.springframework.boot.loader.JarLauncher です。では、次に、このクラスが正確に何をするのかを見てみる必要があります。

 // JarLauncher.java
 public class JarLauncher extends ExecutableArchiveLauncher {
     static final String BOOT_INF_CLASSES = "BOOT-INF/classes/";
     static final String BOOT_INF_LIB = "BOOT-INF/lib/";
     public JarLauncher() {
     }
     // ...省略无关代码
     public static void main(String[] args) throws Exception {
         (new JarLauncher()).launch(args);
     }
 }

明白な main 関数が注目を集めています。はい、これが入り口です。JarLauncher の空の構造を見ると、コードはありません。まずその親クラスを探しましょう:

 // ExecutableArchiveLauncher.java
 public abstract class ExecutableArchiveLauncher extends Launcher {
     public ExecutableArchiveLauncher() {
         try {
             this.archive = this.createArchive();
         } catch (Exception var2) {
             throw new IllegalStateException(var2);
         }
     }
     // ...省略
 }
 
 // Launcher.java
 public abstract class Launcher {
     public Launcher() {}
     // ...省略无关代码
 }

コードからわかるように、実際に作業を行う親クラスは ExecutableArchiveLauncher です。これは、初期化中にアーカイブ インスタンスを構築し、/META-INF/MANIFEST.MF File をカプセル化します。情報。また、後ほど利用させていただきます。

次に起動メソッドが来ます。コアの実行プロセスのみに注目します:

 // Launcher.java
 protected void launch(String[] args) throws Exception {
     JarFile.registerUrlProtocolHandler();
     ClassLoader classLoader = this.createClassLoader(this.getClassPathArchives());
     this.launch(args, this.getMainClass(), classLoader);
 }
 // ExecutableArchiveLauncher.java
 protected String getMainClass() throws Exception {
     Manifest manifest = this.archive.getManifest();
     String mainClass = null;
     if (manifest != null) {
         mainClass = manifest.getMainAttributes().getValue("Start-Class");
     }
 
     if (mainClass == null) {
         throw new IllegalStateException("No 'Start-Class' manifest entry specified in " + this);
     } else {
         return mainClass;
     }
 }

ここでは、最初にサブクラス ExecutableArchiveLauncher の getMainClass メソッドを呼び出します。メイン ロジックは /META からのものです。 -INF/MANIFEST. スタートアップに関連付けられた com.vivo.internet.nex.repeater.console.RepeaterConsoleApplication 文字列に対応する MF ファイルから Start-Class 情報を取得します。私たちが書いたクラス。

続いて、launch メソッドの具体的な実行ですが、launch() はまず MainMethodRunner を作成し、上記で取得した Start-Class と透過パラメータを渡してから、MainMethodRunner の run メソッドを呼び出します。 run メソッドの実行も非常に簡単です。Start-Class に対応するスタートアップ クラスをロードし、そのスタートアップ クラスの main メソッドをリフレクティブに呼び出すだけです。その後、コンテナの初期化プロセスが続きます。

rree

以上がSpringBootアプリケーションの起動エントリをカプセル化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。