3

Manchmal Schnittstellen sind mit @ Komponent Annotation kommentiert. Meine offensichtliche Schlussfolgerung war, dass Klassen, die eine solche Schnittstelle implementieren, ebenfalls als Komponenten behandelt werden. Aber wenn ich recht habe, ist das nicht der Fall.Die Schnittstellen werden im Frühling IoC/DI mit @Component Annotation versehen. Was könnte der Grund sein?

Also was ist der Zweck von @ Komponent Annotation auf Schnittstellen.

+0

* "Aber wenn ich recht habe, ist das nicht der Fall." * - Warum glaubst du das? – Tom

+0

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

+1

"Manchmal Schnittstellen sind mit @ Komponent Annotation kommentiert." Können Sie ein konkretes Beispiel geben? – davidxxx

Antwort

3

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.

Verwandte Themen