Modusanmerkung
Stereotyp Annotation - Modus als Anmerkungen bekannt, Frühlings- und Notizen im gemeinsamen Modus haben @Service
, @Repository
, @Controller
und so weiter, sie werden als „abgeleitet“ von @Component
Kommentaren. Wir alle wissen, dass alle mit @Component
Anmerkungen versehenen Klassen bis zum Frühjahr gescannt und in den IOC-Container aufgenommen werden. @Component
Die durch die abgeleiteten Anmerkungen mit Anmerkungen versehenen Klassen werden auch in den IOC-Container gescannt. Im Folgenden lernen wir hauptsächlich @Component
die "Ableitung" und "Überlagerung" durch Anmerkungen im benutzerdefinierten Modus .
@Komponente "Derivat"
Erstellen Sie ein neues Spring Boot-Projekt. Die Spring Boot-Version ist 2.1.0.RELEASE, Autoconfig artifactId
und spring-boot-starter-web
Abhängigkeiten werden eingeführt . Die Projektstruktur ist wie folgt:
Im com.example.demo
Fall der neuen annotation
Paket und erstellen Sie einen FirstLevelService
Kommentar:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Service
public @interface FirstLevelService {
String value() default "";
}
Diese Annotation wird durch @Service
Annotationen definiert , @Service
und Sie werden feststellen, dass sie beim Anzeigen des Quellcodes mit Annotationen @Component
versehen ist. Ihre hierarchische Beziehung lautet also:
└─ @ Component
└─ @ Service
└─ @ FirstLevelService
Das @FirstLevelService
ist @Component
aus dem Annotationsmodus abgeleitet, wir müssen testen, ob eine markierte Klasse in den IOC-Container gescannt werden kann:
Klicken Sie unter com.example.demo
Neu unter service
dem Paket auf eine TestService
Klasse:
@SecondLevelService
public class TestService {
}
In com.example.demo
dem neuen bootstrap
Paket, und dann eine erstellen ServiceBootStrap
Klasse für das Testregister TestService
und vom IOC Schiff erhalten:
@ComponentScan("com.example.demo.service")
public class ServiceBootstrap {
public static void main(String[] args) {
ConfigurableApplicationContext context = new SpringApplicationBuilder(ServiceBootstrap.class)
.web(WebApplicationType.NONE)
.run(args);
TestService testService = context.getBean("testService", TestService.class);
System.out.println("TestService Bean: " + testService);
context.close();
}
}
Führen Sie die Hauptmethode dieser Klasse aus. Die Konsolenausgabe lautet wie folgt:
@Komponente "hierarchisch"
Wir com.example.demo.annotation
erstellen eine weitere SecondLevelService
Annotationsdefinition unter dem Pfad . Die Annotation ist durch Folgendes @FirstLevelService
gekennzeichnet:
Zu diesem Zeitpunkt lautet die hierarchische Beziehung:
└─ @ Component
└─ @ Service
└─ @ FirstLevelService
└─ @ SecondLevelService
Wir werden die TestService
obige Annotation durch die Hauptmethode ersetzen @SecondLevelService
und sie dann erneut ausführen ServiceBootStrap
. Die Ausgabe lautet wie folgt:
Es ist ersichtlich, dass das Ergebnis auch erfolgreich ist.
Hierbei ist zu beachten, dass die
@Component
Annotation nur eine Wertattributdefinition enthält, sodass die "abgeleitete" Annotation nur eine Wertattributdefinition enthalten kann.
@ Modul-Treiber aktivieren
@Enable
Modultreiber werden nach Spring Framework 3.1 unterstützt. Im Allgemeinen ist das Modul hier eine Sammlung von Komponenten, um eine bestimmte Funktion zu erreichen. Über den @Enable
Modultreiber können wir die entsprechende Modulfunktion einschalten.
@Enable
Das Modullaufwerk kann in zwei Implementierungsmodi unterteilt werden: "Anmerkungslaufwerk" und "Schnittstellenprogrammierung". Das Folgende ist eine Demonstration nacheinander:
Annotation Driven
Im Frühjahr kann ein annotationsgesteuertes Beispiel aus dem @EnableWebMvc
Quellcode angezeigt werden:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Import({DelegatingWebMvcConfiguration.class})
public @interface EnableWebMvc {
}
Diese Anmerkung erfolgt durch @Import
Importieren einer Konfigurationsklasse DelegatingWebMvcConfiguration
:
Diese Konfigurationsklasse wird von ihr geerbt WebMvcConfigurationSupport
, wodurch einige Bean-Deklarationen definiert werden.
Daher importiert der annotationsgesteuerte
@Enable
Modultreiber tatsächlich@Import
eine Konfigurationsklasse, um die Komponentenregistrierung des entsprechenden Moduls zu realisieren. Wenn diese Komponenten im IOC-Container registriert sind, kann die entsprechende Funktion dieses Moduls verwendet werden.
Definieren wir einen @Enable
Modultreiber basierend auf Annotation- gesteuert.
Klicken Sie unter com.example.demo
Neu unter configuration
dem Paket auf eine HelloWorldConfiguration
Konfigurationsklasse:
@Configuration
public class HelloWorldConfiguration {
@Bean
public String hello() {
return "hello world";
}
}
In dieser Konfigurationsklasse wird eine benannte hello
Bean mit Inhalt definiert hello world
.
Beim com.example.demo.annotation
Erstellen einer nächsten EnableHelloWorld
Anmerkungsdefinition:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(HelloWorldConfiguration.class)
public @interface EnableHelloWorld {
}
Wir haben @Import
die Konfigurationsklasse importiert, die wir gerade für diese Anmerkungsklasse erstellt haben .
Beim com.example.demo.bootstrap
Erstellen einer nächsten TestEnableBootstap
Startklasse zum Testen der @EnableHelloWorld
Annotation gilt Folgendes:
@EnableHelloWorld
public class TestEnableBootstap {
public static void main(String[] args) {
ConfigurableApplicationContext context = new SpringApplicationBuilder(TestEnableBootstap.class)
.web(WebApplicationType.NONE)
.run(args);
String hello = context.getBean("hello", String.class);
System.out.println("hello Bean: " + hello);
context.close();
}
}
Führen Sie die Hauptmethode dieser Klasse aus. Die Konsolenausgabe lautet wie folgt:
Erklären Sie, dass unsere benutzerdefinierte Annotation gesteuert werden kann @EnableHelloWorld
.
Schnittstellenprogrammierung
Zusätzlich zur Verwendung der obigen Methode können wir auch @Enable
Modulantriebe durch Schnittstellenprogrammierung implementieren . Im Frühjahr gibt es @EnableCaching
Anmerkungen, die auf der Schnittstellenprogrammierung basieren . Überprüfen Sie den Quellcode:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({CachingConfigurationSelector.class})
public @interface EnableCaching {
boolean proxyTargetClass() default false;
AdviceMode mode() default AdviceMode.PROXY;
int order() default 2147483647;
}
EnableCaching
Anmerkungen @Import
importieren eine CachingConfigurationSelector
Klasse, die indirekt die ImportSelector
Schnittstelle implementiert . In der eingehenden Untersuchung der Spring-Komponentenregistrierung haben wir eingeführt, dass die ImportSelector
Komponentenregistrierung durch erreicht werden kann .
Daher
@Enable
besteht das Wesentliche beim Implementieren der Modulsteuerung durch die Schnittstellenprogrammierung darin@Import
, die Schnittstellenimplementierungsklasse zu importierenImportSelector
, die die Komponenten definieren kann, die im IOC-Container registriert werden müssen, um die Registrierung der entsprechenden Komponenten des entsprechenden Moduls zu realisieren.
Als nächstes werden wir es nach dieser Idee wieder realisieren:
Im com.example.demo
neuen selector
Paket dann ein neuer Pfad in den HelloWorldImportSelector
implementierten ImportSelector
Schnittstellen:
public class HelloWorldImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{HelloWorldConfiguration.class.getName()};
}
}
Wenn Sie die Bedeutung des obigen Codes nicht verstehen, können Sie den Artikel über das eingehende Erlernen der Registrierung von Spring-Komponenten lesen .
Dann ändern wir EnableHelloWorld
:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(HelloWorldImportSelector.class)
public @interface EnableHelloWorld {
}
Der obige Import ist HelloWorldImportSelector
nicht HelloWorldConfiguration
.
Führen Sie TestEnableBootstap
die Hauptmethode erneut aus, und Sie werden feststellen, dass die Ausgabe dieselbe ist.
Automatische Montage
Die unterste Schicht der automatischen Montagetechnologie in Spring Boot verwendet hauptsächlich die folgenden Technologien:
-
Annotationsbaugruppe für den Federmodus
-
Spring @Enable Modulbaugruppe
-
Federbedingte Montage (eingeführt in der eingehenden Untersuchung der Registrierung von Federkomponenten )
-
Federfabrik-Lademechanismus
Die Implementierungsklasse des Spring Factory-Lademechanismus lautet SpringFactoriesLoader
: Überprüfen Sie den Quellcode:
Die Methode dieser Klasse liest die Konfigurationsdatei spring.factories im Verzeichnis META-INF. Wir überprüfen die Datei unter spring-boot-autoconfigure-2.1.0.RELEASE.jar:
Wenn die Startklasse @EnableAutoConfiguration
markiert ist, werden alle Klassen im obigen Screenshot von Spring gescannt, um festzustellen, ob sie zur Verwaltung in den IOC-Container aufgenommen werden können.
Zum Beispiel org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration
der Quellcode, den wir angesehen haben :
Es ist ersichtlich, dass in dieser Kategorie einige Anmerkungen markiert sind, darunter @Configuration
Modusanmerkungen, @EnableConfigurationProperties
Modulmontagetechnologie und ConditionalOnClass
bedingte Montagetechnologie. Dies steht im Einklang mit den oben aufgeführten Haupttechnologien der automatischen Montage von Spring Boot, sodass wir eine Implementierung der automatischen Montage basierend auf dieser Idee anpassen können.
Erstellen Sie eine neue Konfigurationsklasse HelloWorldAutoConfiguration
:
@Configuration
@EnableHelloWorld
@ConditionalOnProperty(name = "helloworld", havingValue = "true")
public class HelloWorldAutoConfiguration {
}
Erstellen Sie dann ein neues META-INF-Verzeichnis unter dem Ressourcenverzeichnis und erstellen Sie eine spring.factories-Datei:
# Automatisch konfigurieren org.springframework.boot.autoconfigure.EnableAutoConfiguration = \ com.example.demo.configuration.HelloWorldAutoConfiguration
Fügen Sie dann die helloworld=true
Konfiguration in die Konfigurationsdatei application.properties ein
helloworld = wahr
Zum Schluss erstellen EnableAutoConfigurationBootstrap
, testen, HelloWorldAutoConfiguration
ob es funktioniert:
@EnableAutoConfiguration
public class EnableAutoConfigurationBootstrap {
public static void main(String[] args) {
ConfigurableApplicationContext context = new SpringApplicationBuilder(EnableAutoConfigurationBootstrap.class)
.web(WebApplicationType.NONE)
.run(args);
String hello = context.getBean("hello", String.class);
System.out.println("hello Bean: " + hello);
context.close();
}
}
Führen Sie die Hauptmethode aus. Die Konsolenausgabe lautet wie folgt:
Es zeigt, dass unsere kundenspezifische automatische Montage erfolgreich war.
Nachfolgend finden Sie eine kurze Analyse der laufenden Logik des Codes:
-
Der werkseitige Lademechanismus von Spring liest automatisch den Inhalt der Datei spring.factories im META-INF-Verzeichnis.
- Wir haben in spring.factories definiert:
org.springframework.boot.autoconfigure.EnableAutoConfiguration = \ com.example.demo.configuration.HelloWorldAutoConfiguration
Wir verwenden
@EnableAutoConfiguration
Anmerkungen für die Testklasse. Diese wird dannHelloWorldAutoConfiguration
bis zum Frühjahr gescannt, um festzustellen, ob sie den Anforderungen entspricht. Wenn sie die Anforderungen erfüllt, wird sie in den IOC-Container aufgenommen.
-
HelloWorldAutoConfiguration
Die Funktion der@ConditionalOnProperty
obigen Annotation lautet: Wennhelloworld=true
diese Klasse in der Konfigurationsdatei konfiguriert wurde (wir haben diese Konfiguration hinzugefügt, damit sie den Anforderungen entspricht), erfüllt sie die Scanregeln. Die@EnableHelloWorld
Annotation ist eine benutzerdefinierte modulgesteuerte Annotation in unserem vorherigen Beispiel führt die Hallo-Bohne ein, sodass die Hallo-Bohne im IOC-Container vorhanden ist; -
Durch die obigen Schritte können wir die Hallo-Bohne durch den Kontext bekommen.