talk is cheap, show me the code.

Coding

类结构如下

  • java
  • com.itplh.spi
  • Animal.java
  • Bat.java
  • Cat.java
  • Dog.java
  • Test.java
  • resources
  • META-INF
  • services
  • com.itplh.spi.Animal

Animal.java

@FunctionalInterface
public interface Animal {

    void shout();

}

Cat.java

@Slf4j
public class Cat implements Animal {
    @Override
    public void shout() {
        log.info("miao moiao miao ~");
    }
}

Dog.java

@Slf4j
public class Dog implements Animal {
    @Override
    public void shout() {
        log.info("wang wang wang ~");
    }
}

Bat.java

@Slf4j
public class Bat implements Animal {
    @Override
    public void shout() {
        log.info("don't know bat how shout.");
    }
}

配置文件 Animal

com.itplh.spi.Cat
com.itplh.spi.Dog

Test.java

public class Test {

    public static Map<Class<? extends Animal>, Animal> serviceMap = new ConcurrentHashMap<>(6);

    static {
        ServiceLoader<? extends Animal> load = ServiceLoader.load(Animal.class);
        Iterator<? extends Animal> iterator = load.iterator();
        while (iterator.hasNext()) {
            Animal animal = iterator.next();
            serviceMap.put(animal.getClass(), animal);
        }
    }

    public static void main(String[] args) {
        serviceMap.get(Cat.class).shout();
        serviceMap.get(Dog.class).shout();
        new Bat().shout();
    }
}

输出

19:50:30.225 [main] INFO com.itplh.spi.Cat - miao moiao miao ~
19:50:30.229 [main] INFO com.itplh.spi.Dog - wang wang wang ~
19:50:30.230 [main] INFO com.itplh.spi.Bat - don't know bat how shout.

应用场景

  • Mysql驱动的选择driverManager根据配置来确定要使用的驱动;
  • dubbo框架中的扩展机制 dubbo官网链接

参考

高级开发必须理解的Java中SPI机制

听过了API咱们来看看SPI是什么


阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Java