Java的 spi机制

Spi的背景:

1)我们现在的编程主要是接口编程,模块之间不对实现进行硬编码,
2)一旦代码中涉及具体的实现,就违反了可插拔的原则,如果要替换一种实现就需要修改代码。

spi的用处:

为了实现模块装配的时候不写死代码,spi提供了一种服务发现机制,有点类似IOC的思想,将装配的控制权转移到代码外,意思就是你如果在装配的时候有2个实现类,那么你可以通过配置文件来写要加载的实现类。

Spi的缺点:

1)Jdk标准的SPI会一次性实例化扩展点所有的实现,由于是全部加载不管是否2)有使用到所有很浪费资源
没有IOC和AOP的支持

Spi的约定

1)一个提供者,提供了一个接口并存在多种实现的时候。
2)一般会在Jar包的META-INF/services/目录下,创建一个接口的路径+接口名称的文件,该文件的内容就是该接口具体的实现类的名称,当外部程序装配该模块的时候就可以通过该jar包META-INF/services/里面的配置文件找到对应的实现类名,并完成模块的注入、装载实例化。(jdk提供了一个工具类来实现查找服务:java.util.ServiceLoader)。

spi的简单例子

接口定义

package spi;

public interface SayHello {

  public void hello();

}

2个实现类

package spi;

public class MingHello implements SayHello{

  @Override
  public void hello() {
    System.out.println("您好!我是明");
  }
}
package spi;

public class YueHello implements SayHello {

  @Override
  public void hello() {
    System.out.println("您好!我是月");
  }

}

META-INF.services下的实现类加载文件

文件名:spi.SayHello
文件内容
spi.MingHello
spi.YueHello

程序入口

package spi;

import java.util.ServiceLoader;

public class MainSpi {

  public static void main(String[] args) {

    ServiceLoader<SayHello> sayHesLoader  = ServiceLoader.load(SayHello.class);

    for(SayHello sayHes:sayHesLoader){
       sayHes.hello();
    }

  }
}

输出结果

spi

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值