简述Java的SPI技术

人狠话不多,先上截图和代码吧。

   

 这是工程目录。看到resources目录下面没有,添加了META-INF和services目录。

添加了一个com.gys.test.IAnimal文件。这个文件名和上面的接口名完全对应。这个目录的文件名是有讲究的,按照SPI规范来的。

上代码:

package com.gys.test;

public interface IAnimal {
    void eat();
}

 

package com.gys.test.impl;

import com.gys.test.IAnimal;

public class Bird implements IAnimal {

    @Override
    public void eat() {
        System.out.println("小鸟吃虫子");
    }
}

 

package com.gys.test.impl;

import com.gys.test.IAnimal;

public class Dog implements IAnimal {
    @Override
    public void eat() {
        //System.out.println("小狗吃屎");
        System.out.println("小狗吃骨头");
    }
}

 

package com.gys.test;

import java.util.ServiceLoader;

public class MainTest {
    public static void main(String[] args) {
        ServiceLoader<IAnimal> animals=ServiceLoader.load(IAnimal.class);
        for (IAnimal animal:animals){
            animal.eat();
        }
    }
}

 

源码一角说明META-INF/service:

 

 

 ServiceLoader.load(clsss)就是去ClassPath的MEAT-INF的service下去寻找指定文件;这里的classPath包括外部引入的jar包中的classPath.

如果我们引入了第三方的jar包,如果jar中的META-INF/service有com.gys.test.IAnimal文件,也会被读取,并且实例化里面的类。

SPI使用场景:

自己提供接口让别人提供实现的方式;典型的如JDBC模式。

         

 

posted @ 2020-04-24 09:32  思思博士  阅读(505)  评论(0编辑  收藏  举报