Java中的SPI机制

262 阅读1分钟

前言

Java SPI(Service Provider Interface)是Java官方提供的一种服务发现机制,它允许在运行时动态地加载实现特定接口的类,而不需要在代码中显式地指定该类,从而实现解耦和灵活性

SPI实现

定义一个接口

package cn.com.ut.march.spi;


public interface HelloService {


    void study(String data);
}

接口实现

1、定义StudentServiceImpl实现HelloService方法

package cn.com.ut.march.spi.impl;


import cn.com.ut.march.spi.HelloService;

public class StudentServiceImpl implements HelloService {


    @Override
    public void study(String data) {
        System.out.println("StudentServiceImpl被调用:" + data);
    }
}

2、定义PersonServiceImpl实现HelloService方法

3、然后再resources目录下,创建文件夹路径为META-INF/services

image.png

创建文件cn.com.ut.march.spi.HelloService,其中cn.com.ut.march.spi为包路径,文件内容为

cn.com.ut.march.spi.impl.PersonServiceImpl
cn.com.ut.march.spi.impl.StudentServiceImpl

image.png

4、定义一个main函数

package cn.com.ut.march.spi;


import java.util.Iterator;
import java.util.ServiceLoader;

public class ServiceLoaderTest {

    public static void main(String[] args) {
        ServiceLoader<HelloService> serviceLoader = ServiceLoader.load(HelloService.class);
        Iterator<HelloService> iterator = serviceLoader.iterator();
        while (iterator.hasNext()) {
            HelloService service = iterator.next();
            service.study("ssss");
        }
    }
}

输出结果为

image.png

总结

可以利用SPI机制更好实现类的加载等,比如Spring或者MySQL驱动加载等,都是很好利用了SPI机制