【JAVA基礎】Java中的SPI初探

talk is cheap, show me the code.

類結構如下

  • 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.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章