eine Schnittstelle mit @Component
mit Anmerkungen versehen ist für das Frühjahr Klassen gemeinsam, vor allem für einige Frühling Klischee Anmerkungen:
package org.springframework.stereotype;
...
@Component
public @interface Service {...}
oder:
package org.springframework.boot.test.context;
...
@Component
public @interface TestComponent {...}
@Component
nicht als vererbte Anmerkung erklärt:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Component {...}
Aber was auch immer, während Beim Laden des Kontexts entdeckt Spring die Beans, indem die Hierarchie der in der Kandidatenklasse deklarierten Annotation berücksichtigt wird.
In der org.springframework.boot.BeanDefinitionLoader
-Klasse (im Frühjahr Boot-Abhängigkeit enthalten), die Bean-Definitionen aus dem zugrunde liegenden Quellen lädt, können Sie ein Beispiel für org.springframework.core.annotation.AnnotationUtils.findAnnotation()
sehen, die Frühlings-Anmerkungen in der gesamten Hierarchie der Anmerkung abruft:
class BeanDefinitionLoader {
...
private boolean isComponent(Class<?> type) {
// This has to be a bit of a guess. The only way to be sure that this type is
// eligible is to make a bean definition out of it and try to instantiate it.
if (AnnotationUtils.findAnnotation(type, Component.class) != null) {
return true;
}
// Nested anonymous classes are not eligible for registration, nor are groovy
// closures
if (type.getName().matches(".*\\$_.*closure.*") || type.isAnonymousClass()
|| type.getConstructors() == null || type.getConstructors().length == 0) {
return false;
}
return true;
}
...
}
Konkret bedeutet dies, wie die @Service
Annotation selbst mit @Component
kommentiert wird, Frühling wird ein Kandidat Klasse mit @Service
als Bohne kommentierten betrachten zu instanziiert.
Also, Ihre Mutmaßungen ist richtig:
Klassen, die eine solche Schnittstelle implementieren werden als Komponenten wie gut behandelt werden.
Das funktioniert aber nur für Schnittstellen (wie @Service
), die Java-Annotationen sind und nicht für die Ebene Schnittstellen.
für Frühlings-Klassen, auf diese Weise zu tun, ist sinnvoll, sondern auch für Ihre eigenen Bohnen (tatsächliche Klischee zum Beispiel bereichern), eher @Component
für die Schnittstelle als die Umsetzung nicht funktionieren und würde mehr Nachteile als Vorteile mit sich bringen:
vereitelt es in gleicher Weise den Zweck einer Schnittstelle, die vor allem ein Vertrag ist. Es verbindet es mit Spring und es wird angenommen, dass Sie immer eine einzige Implementierung der Klasse haben werden.
In diesem Fall, warum eine Schnittstelle verwenden?
Es streut das Lesen der Klasse an zwei Stellen, während die Schnittstelle kein Spring-Stereotyp haben muss.
* "Aber wenn ich recht habe, ist das nicht der Fall." * - Warum glaubst du das? – Tom
Wie auch immer ich das gleiche getestet habe. d. h. Spring ist nicht in der Lage, die Klassen zu erkennen und zu steuern, die eine solche Schnittstelle implementieren.Ich musste die Annotation "@ Component" zu den Klassen auch explizit hinzufügen. – samshers
"Manchmal Schnittstellen sind mit @ Komponent Annotation kommentiert." Können Sie ein konkretes Beispiel geben? – davidxxx