Springboot boleh dikatakan sebagai kemahiran penting untuk pengaturcara Java Semua orang tahu bahawa Springboot akhirnya boleh dibungkus ke dalam pakej balang melalui maven, dan kemudian terus menggunakan perintah java -jar
untuk. menjalankan projek web (atau lain-lain). Ini mengelakkan operasi rumit projek web berasaskan tomcat asal. Springboot boleh menjadikan penggunaan perkhidmatan Web begitu mudah kerana ia mempunyai pelayan Jetty (atau Tomcat) terbina dalam, dan memulakan pelayan semasa proses permulaan kontena untuk berjaya menjalankan perkhidmatan Web.
Saya percaya bahawa semua Springbooters akan biasa dengan kod berikut sama ada anda pelajar baharu yang belajar Springboot atau pemandu baharu yang mula mempelajari kod sumber Springboot, kod ini hampir menjadi titik permulaan kami. Kami begitu biasa dengannya sehingga kami fikir ia adalah titik permulaan syurga ajaib Springboot. Tetapi adakah ia benar-benar begitu?
@SpringBootApplication public class Springboot01helloworldApplication { public static void main(String[] args) { SpringApplication.run(Springboot01helloworldApplication.class, args); } }
Kita semua tahu bahawa selepas projek Java dibungkus, keterangan kemasukan pakej jar ditulis di bawah fail /META-INF/MANIFEST.MF
Mari kita lihat kandungan fail ini:
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
Penerangan entri fail ialah nilai yang sepadan dengan Kelas Utama, iaitu, org.springframework.boot.loader.JarLauncher
. Jadi, seterusnya kita perlu melihat apa sebenarnya yang dilakukan oleh kelas ini?
// 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); } }
Fungsi utama yang jelas menarik perhatian kami. Ya, ini adalah pintu masuk yang kosong dan tiada kod pertama:
// 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() {} // ...省略无关代码 }
Seperti yang dapat dilihat daripada kod, kelas induk yang benar-benar melakukan kerja ialah ExecutableArchiveLauncher
Ia membina contoh arkib semasa permulaan, yang merangkum maklumat fail /META-INF/MANIFEST.MF
. Kami juga akan menggunakannya kemudian.
Kemudian datang kaedah pelancaran Kami hanya mengambil berat tentang proses pelaksanaan teras:
// 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; } }
Di sini kami mula-mula memanggil kaedah getMainClass subkelas ExecutableArchiveLauncher Logik utama adalah untuk mendapatkan Kelas Mula maklumat daripada fail /META-INF/MANIFEST.MF
, sepadan dengan yang di atas ialah rentetan com.vivo.internet.nex.repeater.console.RepeaterConsoleApplication
, jadi ia dikaitkan dengan kelas permulaan yang kami tulis.
Kemudian datang pelaksanaan khusus kaedah pelancaran() mula-mula mencipta MainMethodRunner, melepasi parameter Kelas Mula dan telus yang diperoleh di atas, dan kemudian memanggil kaedah larian MainMethodRunner. Pelaksanaan kaedah larian juga sangat mudah, iaitu, memuatkan kelas permulaan yang sepadan dengan Kelas Mula, dan kemudian secara reflektif memanggil kaedah utama kelas permulaan. Selepas itu datang proses pemulaan bekas.
rreeeeAtas ialah kandungan terperinci Bagaimana untuk merangkum kemasukan permulaan aplikasi SpringBoot. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!