java的SPI扩展机制_java的SPI机制

1、概念

SPI(service provider interface)是java提供的一种服务发现机制。是一种扩展机制。它可以通过将接口的实现类的全限定类路径写入规定好的文件中,来指定接口使用那个实现类。

2、简单实现

下面通过一个实例简单说明一下。实例结构是

1f019912d860

image.png

实现步骤

1、定一个接口IColor

2、编写两个接口的实现类BlackColor和WhiteColor

3、在resoure目录下建文件夹META_INFO/services,再在此文件夹下建立一个以接口的全限定名为名称的文件

4、在文件中写入指定的实现类的全限定名。

5、执行测试程序测试是否使用文件中写的实现类

代码:

接口:

public interface IColor {

void getColor();

}

实现类1:

public class WhiteColor implements IColor {

public void getColor() {

System.out.println("white");

}

}

实现类2:

public class BlackColor implements IColor {

public void getColor() {

System.out.println("black");

}

}

测试类:

public class ColorMain {

public static void main(String[] args) {

ServiceLoader serviceLoader = ServiceLoader.load(IColor.class);

Iterator serviceLoaderIter = serviceLoader.iterator();

while (serviceLoaderIter.hasNext()){

IColor iColor = serviceLoaderIter.next();

iColor.getColor();

}

}

}

文件路径及内容:

1f019912d860

文件路径

通过修改文件com.chanyi.spi.IColor中的实现类路径,可以指定接口的实现类

3实际使用案例

在mysql中使用SPI机制加载指定的数据库驱动程序

1f019912d860

image.png

优缺点

1、优点:

解耦,框架的主要流程不用考虑具体某个实现

可扩展,应用方可以通过实现框架定义的接口,扩展框架的功能

2、缺点:

使用的ServiceLoad多线程下不保证线程安全

每次都会加载接口名文件下的实现类,不能够指定加载某个实现类(Dubbo封装SPI解决了此问题)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值