前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[视频讲解]Java SPI | Dubbo SPI |Spring SPI有什么区别

[视频讲解]Java SPI | Dubbo SPI |Spring SPI有什么区别

原创
作者头像
疯狂的KK
修改2023-03-31 20:42:17
1.3K0
修改2023-03-31 20:42:17
举报
文章被收录于专栏:Java项目实战

配套视频:https://cloud.tencent.com/developer/video/76588

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

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

  1. 定义接口
代码语言:javascript
复制
public interface MyService {
    void doSomething();
}
  1. 实现接口
代码语言:javascript
复制
public class MyServiceImpl implements MyService {
    @Override
    public void doSomething() {
        System.out.println("do something by MyServiceImpl");
    }
}
  1. 配置文件

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

代码语言:javascript
复制
com.example.MyService
com.example.MyServiceImpl
  1. 加载实现类
代码语言:javascript
复制
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的实现代码示例如下:

  1. 定义接口
代码语言:javascript
复制
@SPI("default")
public interface MyService {
    void doSomething();
}
  1. 实现接口
代码语言:javascript
复制
@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");
    }
}
  1. 配置文件

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

代码语言:javascript
复制
# META-INF/dubbo/com.example.MyService
impl1=com.example.MyServiceImpl1
impl2=com.example.MyServiceImpl2
  1. 加载实现类
代码语言:javascript
复制
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的实现代码示例如下:

  1. 定义接口
代码语言:javascript
复制
public interface MyService {
    void doSomething();
}
  1. 实现接口
代码语言:javascript
复制
public class MyServiceImpl implements MyService {
    @Override
    public void doSomething() {
        System.out.println("do something by MyServiceImpl");
    }
}
  1. 配置文件

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

代码语言:javascript
复制
com.example.MyService=com.example.MyServiceImpl
  1. 加载实现类
代码语言:javascript
复制
public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext();
        MyService service = context.getBean(MyService.class);
        service.doSomething();
    }
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档