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 サイトの他の関連記事を参照してください。