1. Mengapa saya dapat mencapai konfigurasi otomatis menggunakan anotasi @springbootApplication?
Jawaban: @springbootApplication, sebenarnya ada 3 anotasi internal. @EnableAutoconfiguration, @componentscan, @configuration. Artikel ini terutama menjelaskan anotasi @enablexx
2. Mengapa @enableAutoconfiguration digunakan? Ketika @ConfigurationProperties digunakan, item konfigurasi di .yml atau .properties dapat diimpor secara otomatis?
Jawaban: Di dalam @EnableAutoconfiguration, anotasi @import digunakan. Impor AutoConfigurationImportSelector membantu Springboot memuat konfigurasi yang memenuhi syarat ke dalam wadah IOC. Tetapi penggunaan internal SpringFactoriesLoader digunakan untuk menyelesaikannya. Mirip dengan Java SPI, yaitu, memuat konfigurasi dari /meta-inf/spring.factories
@Target ({elementType.type})@retention (retentionPolicy.runtime)@didokumentasikan@warisan@autoconfigurationpackage@import ({autoconfigurationImportSelector.class}) public @interface enableAutoconfigurationAnda dapat melihat bahwa di @Import, kelas AutoConfigurationImportSelector sebenarnya diimpor. Yang paling penting adalah bahwa kelas ini mengimplementasikan antarmuka importSelector
Antarmuka Publik ImportSelector { /** * Pilih dan kembalikan nama -nama kelas mana yang harus diimpor berdasarkan * {@link annotationmetadata} dari kelas mengimpor@{@@tautan}. */ String [] selectImports (annotationmetadata imporingclassmetadata);}Ini adalah deskripsi ImportSelector, yang kira -kira berarti bahwa kacang yang dikembalikan dengan metode ini akan secara otomatis disuntikkan dan dikelola oleh Spring.
Selanjutnya, mari kita lihat implementasi selectImports di AutoConfigurationImportSelector
string publik [] selectImports (annotationmetadata annotationmetadata) {if (! this.isEnabled (annotationmetadata)) {return no_imports; } else {autoconfigurationMetadata autoconfigurationMetadata = autoconfigurationMetadataLoader.loadmetadata (this.beanclassloader); AnnotationAttributes atribut = this.getAttributes (annotationmetadata); Daftar <string> configurations = this.getCandidateConfigurations (annotationmetadata, atribut); konfigurasi = this.removeduplicates (konfigurasi); Set <string> exclusions = this.getExclusions (annotationmetadata, atribut); this.checkexcludededclasses (konfigurasi, eksklusi); configurations.removeall (pengecualian); configurations = this.filter (konfigurasi, autoconfigurationmetadata); this.fireautoconfigurationImportEvents (konfigurasi, excclusions); return stringutils.tostringarray (konfigurasi); }}Kode ditulis dengan sangat jelas. Saya tidak akan menjelaskannya.
Di @Import, Anda dapat melihat bahwa tautan menunjuk ke importBeandefinitionregistrar. Ini juga merupakan antarmuka, dan fungsinya sama dengan ImportSelector.
Antarmuka Publik ImportBeandefinitionRegistrar {public void registerbeandefinitions (annotationmetadata imporingclassmetadata, beandefinitionregistry registry);}Dalam metode RegisterBeAndefinitions, Anda dapat menggunakan Beandefinitionregistry untuk menyuntikkan kacang yang ingin kami suntikan.
Contoh kode:
Tulis @enable Anda sendiri menggunakan @import
1. Buat 2 biji tes
Peran kelas publik {} pengguna kelas publik {}2. Kustomisasi Aktifkan Anotasi
@Target ({elementType.type})@retensi (retentionpolicy.runtime)@didokumentasikan@import (myenableAutoconfig.class) public @interface enableBean {}3. Implementasikan kelas enableAutoconfiguration Anda sendiri
Kelas Publik MyEnableAutoconfig mengimplementasikan ImportSelector {@Override Public String [] SelectImports (AnnotationMetadata ImportingClassMetadata) {return string baru [] {"com.xhn2.role", "com.xhn2.user"}; }}4. Tulis kelas startup
@Enabebean@componentscan ("com.xhn2") kelas publik utama {public static void main (string [] args) {configurableApplicationContext context = springApplication.run (main.class, args); System.out.println (context.getBean (user.class)); System.out.println (Context.GetBean (Role.class)); }}5. Hasil Operasi
com.xhn2.user@496bc455
com.xhn2.role@59402b8f
Konsol berhasil mencetak.
Contoh Kode 2, Perakitan Otomatis dari Paket Jar Pihak Ketiga
Proyek Maven Baru
1. Pom.xml
<nodelversion> 4.0.0 </ModelVersion> <GroupId> org.csp </groupid> <ArtiFacTid> halo </artifactid> <version> 1.0.0 </version> <props> <maven.source> 1.8 </maven.source.source> <maven.source> </maven.compiler.source> <maven.coRerer.com <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.17.RELEASE</version> </dependency> </dependencies>
2. Tulis Konfigurasi
@ConfigurationPublic kelas myTest {@bean runnable runnable () {return ()-> {}; }}Buat file meta-inf/spring.factories baru di bawah sumber daya dan tambahkan konfigurasi berikut
org.springframework.boot.autoconfigure.enableAutoconfiguration = com.edu.mytest
3. Instal proyek ke repositori Maven lokal: instal MVN
4. Proyek utama memperkenalkan toples yang baru saja diinstal ke daerah setempat.
<dependency> <GroupId> org.csp </groupid> <ArTifactId> halo </artifactid> <version> 1.0.0 </version> </dependency>
5. Dapatkan yang dapat dikonfigurasi sekarang
@SpringbootApplicationPublic Class Main {public static void main (string [] args) {springApplication application = new springApplication (main.class); ConfigurableApplicationContext context = application.run (args); System.out.println (context.getBean (runnable.class)); }}6. Pencetakan Konsol
com.edu.mytest$$lambda$153/284686302@2c07545f
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.