talk is cheap, show me the code.
Coding
类结构如下
- java
- com.itplh.spi
- Animal.java
- Bat.java
- Cat.java
- Dog.java
- Test.java
- com.itplh.spi
- resources
- META-INF
- services
- com.itplh.spi.Animal
- services
- META-INF
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官网链接