1. Warum kann ich eine automatische Konfiguration mit @springbootApplication -Annotation erreichen?
Antwort: @springbootApplication gibt es tatsächlich 3 interne Anmerkungen. @EnableAutoConfiguration, @Componentscan, @Configuration. Dieser Artikel erklärt hauptsächlich @Enablexx Annotation
2. Warum wird @EnableAutoConfiguration verwendet? Wenn @ConfigurationProperties verwendet werden, können die Konfigurationselemente in .yml oder .Properties automatisch importiert werden?
Antwort: In @EnableAutoConfiguration wird die @Import -Annotation verwendet. Importieren Sie AutoconfigurationImportSelector beim Import von Springboot, die qualifizierte Konfiguration in den IOC -Container zu laden. Der interne Einsatz von SpringFactoriesloader wird jedoch verwendet, um es zu vervollständigen. Ähnlich wie bei Java SPI, dh laden Sie die Konfiguration von /meta-inf/spring.factores
@Target ({Elementtype.type})@retention (retentionPolicy.runtime)@documented@erbt@autoconfigurationpackage@import ({autoconfigurationImaMportSelector.class}) public @Interface EnableAutoConfigurationSie können sehen, dass in @Import tatsächlich eine AutoconfigurationImportSelector -Klasse importiert wird. Das Wichtigste ist, dass diese Klasse den Schnittstellenimportselector implementiert
Die öffentliche Schnittstelle ImportSelector { /** * Wählen und geben die Namen der Klasse (es) zurück, basierend auf * der {@link AnnotationMetadata} der importierenden@{@link -Konfiguration}. */ String [] selectImports (AnnotationMetadata ImportingClassMetadata);}Dies ist die Beschreibung des ImportSelectors, was grob bedeutet, dass die von dieser Methode zurückgegebene Bean automatisch nach Frühling injiziert und verwaltet wird.
Schauen wir uns als nächstes die Implementierung von Selektionen in AutoconfigurationImportSelector an
public String [] SelectImports (AnnotationMetadata AnnotationMetadata) {if (! this.isenabled (AnnotationMetadata)) {return no_imports; } else {autoconfigurationMetadata autoconfigurationMetadata = autoconfigurationMetadataloader.loadMetadata (this.beanClassloader); AnnotationAttributes attribute = this.getAttributes (AnnotationMetadata); List <string> configurations = this.getCandidateConfigurations (AnnotationMetadata, Attribute); configurations = this.Removeduplicates (Konfigurationen); Set <string> exclusions = this.getExclusions (AnnotationMetadata, Attribute); this.CheckexcludedClasses (Konfigurationen, exklus); configurations.removeall (Ausschlüsse); configurations = this.Filter (Konfigurationen, AutoconfigurationMetadata); this.fireAutoconfigurationImaPent EVents (Konfigurationen, Excclusions); return Stringutils.toStringArray (Konfigurationen); }}Der Code ist sehr deutlich geschrieben. Ich werde es nicht erklären.
In @import können Sie sehen, dass ein Link auf ImportbeanDefinitionRegistrar zeigt. Dies ist auch eine Schnittstelle, und ihre Funktion ist die gleiche wie ImportSelector.
Public Interface ImportbeanDeFinitionRegistrar {public void RegisterBeandefinitions (AnnotationMetadata ImportingClassMetadata, Registry BeanDefinitionRegistry);};};In der RegisterBeanDeFinitions -Methode können Sie BeanDefinitionRegistry verwenden, um die von uns injizierende Bean zu injizieren.
Codebeispiel:
Schreiben Sie Ihre eigene @Enable mit @import
1. Erstellen 2 Testbohnen
Public Class Rolle {} öffentlicher Klasse Benutzer {}2. Anpassungsanmerkungen anpassen
@Target ({Elementtype.type})@Retention (retentionPolicy.runtime)@documented@import (myenableAutoconfig.class) public @Interface enableBean {{}3. Implementieren Sie Ihre eigene Klasse EnableAutoConfiguration -Klasse
public class myenableAutoconfig implements importSelector {@override public string [] selektimports (AnnotationMetAdaTa ImportingClassMetAdAdata) {return New String [] {"com.xhn2.role", "com.xhn2.user"}; }}4. Schreiben Sie eine Start -up -Klasse
@EnableBean@componentscan ("com.xhn2") public class main {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 (rollen.class)); }}5. Betriebsergebnisse
com.xhn2.user@496bc455
com.xhn2.role@59402b8f
Die Konsole druckt erfolgreich.
Code Beispiel 2, automatische Montage des JAR -Pakets Drittanbieter
Neues Maven -Projekt
1. Pom.xml
<modelVersion> 4.0.0 </modelversion> <gruppeId> org.csp </GroupId> <artifactId> Hallo </artifactId> <version> 1.0.0 </Version> <Porpies> <Maven.compiler.Source> 1.8 </maven.Sourcer.Source> <maven.compiler.sourcer.Sourcer.Sourcer.Sourcer.Sourcer.Sourcer.Sourcer.Sourcer.Sourcer.Sourcer.Sourcer.Sourcer.Sourcer.Sourcer.Sourcer.Sourcer.Sourcer.Sourcer.Sourcer.Sourcer.Sourcer.Sourcer.Sourcer.Sourcer.Sourcer.Sourc - <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. Konfiguration schreiben
@ConfigurationPublic Class myTest {@Bean public Runnable Runnable () {return ()-> {}; }}Erstellen Sie eine neue Meta-Inf/Spring.Factores-Datei unter Ressourcen und fügen Sie die folgende Konfiguration hinzu
org.springframework.boot.autoconfigure.enableAutoconfiguration = com.edu.myTest
3. Installieren Sie das Projekt im lokalen Maven -Repository: MVN Installation
V.
<De vorhöhe> <gruppe> org.csp </Groupid> <artifactId> Hallo </artifactId> <version> 1.0.0 </Version> </abhängig>
5. Lassen Sie den Runnable gerade konfigurieren
@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. Konsolendruck
com.edu.myTest$$lambda$153/284686302@2c07545f
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.