【视频讲解配套PPT】Java SPI | Dubbo SPI |Spring SPI有什么区别

简介: SPI(Service Provider Interface)是一种服务发现机制,它通过在类路径下的META-INF/services目录下的配置文件来发现服务实现类,实现了面向接口编程的扩展性。

配套视频:https://cloud.tencent.com/developer/user/6026903/video
image.png

SPI(Service Provider Interface)是一种服务发现机制,它通过在类路径下的META-INF/services目录下的配置文件来发现服务实现类,实现了面向接口编程的扩展性。

Java SPI是JDK自带的一种SPI机制,它通过在META-INF/services目录下的配置文件中指定接口的实现类来实现。Java SPI只能加载到类路径下的实现类,不支持动态添加和删除实现类。Java SPI的实现代码示例如下:

定义接口

public interface MyService {
    void doSomething();
}

实现接口

public class MyServiceImpl implements MyService {
    @Override
    public void doSomething() {
        System.out.println("do something by MyServiceImpl");
    }
}

配置文件
在META-INF/services目录下创建一个以接口全限定名为文件名的文件,并在文件中指定实现类的全限定名。

com.example.MyService
com.example.MyServiceImpl
加载实现类
public class Main {
    public static void main(String[] args) {
        ServiceLoader<MyService> loader = ServiceLoader.load(MyService.class);
        for (MyService service : loader) {
            service.doSomething();
        }
    }
}

Dubbo SPI是Apache Dubbo框架自带的一种SPI机制,它在Java SPI基础上进行了扩展,支持动态添加和删除实现类。Dubbo SPI的实现代码示例如下:

定义接口

@SPI("default")
public interface MyService {
    void doSomething();
}

实现接口

@SPI("impl1")
public class MyServiceImpl1 implements MyService {
    @Override
    public void doSomething() {
        System.out.println("do something by MyServiceImpl1");
    }
}

@SPI("impl2")
public class MyServiceImpl2 implements MyService {
    @Override
    public void doSomething() {
        System.out.println("do something by MyServiceImpl2");
    }
}

配置文件
在META-INF/dubbo目录下创建一个以接口全限定名为文件名的文件,并在文件中指定实现类的名称和对应的扩展名。

# META-INF/dubbo/com.example.MyService
impl1=com.example.MyServiceImpl1
impl2=com.example.MyServiceImpl2

加载实现类

public class Main {
    public static void main(String[] args) {
        ExtensionLoader<MyService> loader = ExtensionLoader.getExtensionLoader(MyService.class);
        MyService service = loader.getExtension("impl1");
        service.doSomething();
    }
}

Spring SPI是Spring框架自带的一种SPI机制,它通过在META-INF/spring.factories文件中指定实现类来实现。Spring SPI的实现代码示例如下:

定义接口

public interface MyService {
    void doSomething();
}

实现接口

public class MyServiceImpl implements MyService {
    @Override
    public void doSomething() {
        System.out.println("do something by MyServiceImpl");
    }
}

配置文件
在META-INF/spring.factories文件中指定实现类的全限定名。

com.example.MyService=com.example.MyServiceImpl

加载实现类

public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext();
        MyService service = context.getBean(MyService.class);
        service.doSomething();
    }
}
目录
相关文章
|
12天前
|
人工智能 Java API
Spring AI 抢先体验,5 分钟玩转 Java AI 应用开发
Spring Cloud Alibaba AI 以 Spring AI 为基础,并在此基础上提供阿里云通义系列大模型全面适配,让用户在 5 分钟内开发基于通义大模型的 Java AI 应用。
|
23小时前
|
Java
java一分钟之-字符流与字节流的区别
【5月更文挑战第11天】Java的输入输出通过流操作,分为字符流和字节流。字节流处理二进制数据,如图片、音频,基类是`InputStream`和`OutputStream`;字符流处理文本,基类是`Reader`和`Writer`。字符流涉及编码转换,字节流不涉及。易错点包括乱码(需指定编码)、混用流类型和忘记关闭流。示例展示了字节流和字符流读文件。理解区别并注意编码和资源管理可提高代码质量。
9 3
|
1天前
|
移动开发 前端开发 NoSQL
ruoyi-nbcio从spring2.7.18升级springboot到3.1.7,java从java8升级到17(二)
ruoyi-nbcio从spring2.7.18升级springboot到3.1.7,java从java8升级到17(二)
|
1天前
|
JSON 前端开发 Java
【JAVA进阶篇教学】第七篇:Spring中常用注解
【JAVA进阶篇教学】第七篇:Spring中常用注解
|
2天前
|
XML Java 数据库连接
【JAVA基础篇教学】第十五篇:Java中Spring详解说明
【JAVA基础篇教学】第十五篇:Java中Spring详解说明
|
3天前
|
安全 Java 编译器
Java中String、StringBuilder和StringBuffer的区别
Java中String、StringBuilder和StringBuffer的区别
|
3天前
|
数据库连接
java+ssm+vue代码视频学习讲解
java+ssm+vue代码视频学习讲解
6 0
|
3天前
|
前端开发 安全 Java
使用Spring框架加速Java开发
使用Spring框架加速Java开发
8 0
|
5天前
|
传感器 人工智能 前端开发
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
智慧校园电子班牌,坐落于班级的门口,适合于各类型学校的场景应用,班级学校日常内容更新可由班级自行管理,也可由学校统一管理。让我们一起看看,电子班牌有哪些功能呢?
47 4
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
|
10天前
|
XML 监控 安全
18:面向切面编程-Java Spring
18:面向切面编程-Java Spring
27 5