标签:ade 文件 代码 ons extension provider nts meta sources
SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。目前有不少框架用它来做服务的扩展发现,简单来说,它就是一种动态替换发现的机制。使用SPI机制的优势是实现解耦,使得第三方服务模块的装配控制逻辑与调用者的业务代码分离。
Java中如果想要使用SPI功能,先提供标准服务接口,然后再提供相关接口实现和调用者。这样就可以通过SPI机制中约定好的信息进行查询相应的接口实现。
创建空白项目——java_spi_demo
创建module——java_spi_demo_api
新建
package com.dxh.service;
public interface HelloService {
String sayHello();
}
创建module——java_spi_demo_impl
pom中加入依赖
<dependency>
<groupId>com.dxh</groupId>
<artifactId>java_spi_demo_api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
编写实现类
package com.dxh.service.impl;
import com.dxh.service.HelloService;
public class HumanHelloService implements HelloService {
@Override
public String sayHello() {
return "Hello 你好~";
}
}
在resource下建立文件夹——META-INF.services
在META-INF/services目录下创建一个以“接口全限定名”为命名的文件,内容为实现类的全限定名
新建文件com.dxh.service.HelloService
,
com.dxh.service.impl.HumanHelloService
新建module——java_spi_demo_main
新建测试方法
package com.dxh.test;
import com.dxh.service.HelloService;
import java.util.ServiceLoader;
public class JavaSpiMain {
public static void main(String[] args) {
final ServiceLoader<HelloService> helloServices = ServiceLoader.load(HelloService.class);
for (HelloService helloService:helloServices){
System.out.println(helloService.getClass().getName()+":"+helloService.sayHello());
}
}
}
返回结果:com.dxh.service.impl.HumanHelloService:Hello 你好~
目录结构:
dubbo中大量的使用了SPI来作为扩展点,通过实现同一接口的前提下,可以进行定制自己的实现类。
比如比较常见的协议,负载均衡,都可以通过SPI的方式进行定制化,自己扩展。
Dubbo中已经存在的所有已经实现好的扩展点:
下图中则是Dubbo中默认提供的负载均衡策略:
分为三个项目演示:
新建maven项目:dubbo_spi_demo
dubbo_spi_demo_api
@SPI
注解<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.5</version>
</dependency>
package com.dxh.service;
import org.apache.dubbo.common.extension.SPI;
@SPI
public interface HelloService {
String sayHello();
}
dubbo_spi_demo_impl
<dependency>
<groupId>com.dxh</groupId>
<artifactId>dubbo_spi_demo_api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
package com.dxh.service.impl;
import com.dxh.service.HelloService;
public class HumanServiceImpl implements HelloService {
@Override
public String sayHello() {
return "Hello 你好";
}
}
META-INF/dubbo
,区别于JDK提供的spi的文件名META-INF/services
human=com.dxh.service.impl.HumanServiceImpl
dubbo_spi_demo_main
<dependency>
<groupId>com.dxh</groupId>
<artifactId>dubbo_spi_demo_api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.dxh</groupId>
<artifactId>dubbo_spi_demo_impl</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
package com.dxh;
import com.dxh.service.HelloService;
import org.apache.dubbo.common.extension.ExtensionLoader;
import java.util.Set;
public class DubboSpiMain {
public static void main(String[] args) {
//获取扩展加载器
ExtensionLoader<HelloService> extensionLoader = ExtensionLoader.getExtensionLoader(HelloService.class);
//遍历所有的扩展点 META-INF.dubbo
Set<String> extensions = extensionLoader.getSupportedExtensions();
for (String extension : extensions) {
String sayHello = extensionLoader.getExtension(extension).sayHello();
System.out.println(sayHello);
}
}
}
目录结构:
标签:ade 文件 代码 ons extension provider nts meta sources
原文地址:https://www.cnblogs.com/isdxh/p/14687645.html