Dubbo SPI (Service Provider Interface)

1. Demonstrationsfall

Github: Dubbo-Demo-Spi

JDK ServiceLoader-Beispiel

ServiceLoaderMain-Klasse: Der Testeintrag von ServiceLoader.
ServiceLoaderInterface-Schnittstelle: Definieren Sie eine Schnittstelle. Die spezifische Implementierung wird im Verzeichnis resources / META-INF / services / com.alibaba.dubbo.demo.ServiceLoaderInterface definiert.

Dubbo SPI Beispiel

SPIMain-Klasse: Der Testeintrag von SPI.
SPIService-Schnittstelle: Definieren Sie eine @ SPI-Schnittstelle. Die spezifische Implementierung wird im Verzeichnis resources / META-INF / dubbo / internal / com.alibaba.dubbo.demo.SPIService definiert.

2. Relevante Lösungen

@ SPI

Beschreibung: Die Annotation bezieht sich auf die Klasse, mit der eine Schnittstelle definiert wird.
Fall: Die Transporter-Schnittstelle verwendet die Annotation @SPI ("netty") und ihre Implementierung wird im Verzeichnis resources / META-INF / dubbo / internal / com.alibaba.dubbo.remoting.Transporter definiert.

@ Adaptiv

Beschreibung: Wenn sich die Annotation in der Klasse befindet, kann das Instanzobjekt über ExtensionLoader # getAdaptiveExtension () abgerufen werden. Wenn sich die Annotation in der Methode befindet, wird die Implementierungsklasse durch Parameter bestimmt.

@Aktivieren Sie

Beschreibung: Die Annotation befindet sich in der Klasse. Wenn der Gruppenparameter übereinstimmt, wird die Implementierung aktiviert.
Fall: Die Filterschnittstelle verwendet die @ SPI-Annotation und die Implementierungsklasse ActiveLimitFilter verwendet die @ Active-Annotation. Wenn group = "consumer" ist, wird der Filter aktiviert.

3. Kernklasse: ExtensionLoader

  • ExtensionLoader # getExtension (String): Ruft das Implementierungsklassenobjekt nach Namen ab.
  • ExtensionLoader # getAdaptiveExtension (): Ruft das Implementierungsklassenobjekt mit der Annotation @Adaptive in der Implementierungsklasse ab.
  • ExtensionLoader # injizExtension (T): Verwenden Sie die Abhängigkeitsinjektion, um Objekte zu injizieren.
  • ExtensionLoader # createAdaptiveExtensionClassCode (): Wenn die Methode eine @ Adaptive-Annotation enthält, muss die Zeichenfolge der Implementierungsklasse automatisch für die Erweiterungspunktschnittstelle generiert werden.
  • ExtensionLoader # getActivateExtension (URL-URL, Zeichenfolgenschlüssel, Zeichenfolgengruppe): Filtern Sie die Implementierungsklassenobjekte, die die Annotation @Activate enthalten, und die Gruppenattributübereinstimmungen.

Ich denke du magst

Origin blog.csdn.net/fomeiherz/article/details/104468157
Empfohlen
Rangfolge