1、新建父工程:java-dubbo-spi-demo
2、新建子模块 dubbo-api,pom 文件引入 dubbo 组件
<dependencies>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.5</version>
</dependency>
</dependencies>
接口类:
package com.deppon.service;
import org.apache.dubbo.common.extension.SPI;
@SPI
public interface AnimalService {
String say(String name);
}
3、新建子模块 dubbo-spi-impl ,pom 文件引入 dubbo-api 接口模块
<dependencies>
<dependency>
<groupId>org.example</groupId>
<artifactId>java-dubbo-spi-demo-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
实现类:
package com.deppon.impl;
import com.deppon.service.AnimalService;
public class CatAnimal implements AnimalService {
@Override
public String say(String name) {
return name + ":喵喵";
}
}
public class DogAnimal implements AnimalService {
@Override
public String say(String name) {
return name + ":汪汪";
}
}
新建文件路径:如何找到具体的实现类?
① 在 resources 下新建文件夹(固定名称)META-INF/dubbo
② 新该文件下新建文件名(固定接口名)com.deppon.service.AnimalService
③ 该文件中具体内容为实现类的全路径
cat=com.deppon.impl.CatAnimal
dog=com.deppon.impl.DogAnimal
4、新建 dubbo-spi 启动模块 java-dubbo-spi-demo-main ,pom 引入 dubbo-api、dubbo-impl、 dubbo 组件
<dependencies>
<dependency>
<groupId>org.example</groupId>
<artifactId>java-dubbo-spi-demo-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.example</groupId>
<artifactId>java-dubbo-spi-demo-impl</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.5</version>
</dependency>
</dependencies>
启动类编写:
public class DubboSpiMain {
public static void main(String[] args) {
//获取扩展加载器
ExtensionLoader<AnimalService> extensionLoader = ExtensionLoader.getExtensionLoader(AnimalService.class);
//遍历所有的扩展点 META-INF/dubbo
Set<String> extensions = extensionLoader.getSupportedExtensions();
for(String extension:extensions){
String result = extensionLoader.getExtension(extension).say("动物");
System.out.println(result);
}
}
}