一, 定义一个接口
package org.example.spi; public interface HelloSPI { void sayHello(); }
二, 定义接口实现类
ImageHello实现类
package org.example.spi; public class ImageHello implements HelloSPI{ @Override public void sayHello() { System.out.println("Image Hello"); } }
TextHello实现类
package org.example.spi; public class TextHello implements HelloSPI{ @Override public void sayHello() { System.out.println("Text Hello"); } }
在resources目录下创建META-INF/services目录并在该目录下创建接口配置文件
文件名: org.example.spi.HelloSPI ; 文件内容:
org.example.spi.TextHello org.example.spi.ImageHello
三, 在项目里面引入以上项目的依赖
<dependency> <groupId>org.example</groupId> <artifactId>com.cn.spi</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
这时可以通过项目直接使用了;如果这时候想要进行扩展,在新项目里面继续实现接口
package org.example; import org.example.spi.HelloSPI; public class CustomerSPI implements HelloSPI { @Override public void sayHello() { System.out.println("Customer Hello"); } }
然后在resources目录下创建META-INF/services目录并在该目录下创建接口配置文件
文件名: org.example.spi.HelloSPI ; 文件内容:
org.example.CustomerSPI
如果我们想要选择性的来指定实现类,则可以通过ServiceLoader来获取实现类
ServiceLoader<HelloSPI> load = ServiceLoader.load(HelloSPI.class); // 执行不同厂商的业务实现,具体根据业务需求配置 for (HelloSPI helloSPI : load) { helloSPI.sayHello(); }
注:
如果在多模块的项目中引入依赖,不能直接实现接口来扩展,一般需要新建一个类打一个新jar包,然后在多模块项目里面引入进来.
----------------------------------------------------------------------------------------------------------
Service provider interface缩写, 接口服务发现的一种机制, 一般用来做组件化开发,达到解耦的目的.