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.