简单实现
- 准备四个工程
- spi
- spi-jdbc
- spi-redis
- spi-test
SPI服务
public interface DbConnection {
void connection(String name);
}
JDBC服务
- resources下创建META-INF.services文件夹
- 创建文件com.gouying.web.api.DbConnection(接口的全路径)
- 内容com.gouying.web.api.Jdbc(实现接口的全路径)
public class Jdbc implements DbConnection {
public void connection(String name){
System.out.println("JDBC connection...." + name);
}
}
Redis服务
- resources下创建META-INF.services文件夹
- 创建文件com.gouying.web.api.DbConnection(接口的全路径)
- 内容com.gouying.web.api.Redis(实现接口的全路径)
public class Redisimplements DbConnection {
public void connection(String name){
System.out.println("JDBC connection...." + name);
}
}
TEST服务
public class MainLoadClass {
public static void main(String[] args) {
ServiceLoader<DbConnection> loads = ServiceLoader.load(DbConnection.class);
for (DbConnection load : loads) {
load.connection(load.getClass().getName());
}
}
}
官方定义 ServiceLoader
- 一个简单的服务提供商加载工具。
服务是一组众所周知的接口和(通常是抽象的)类。服务提供商是服务的特定实现。提供程序中的类通常实现接口,并将服务本身中定义的类子类化。服务提供商可以以扩展的形式安装在 Java 平台的实现中,即,将 jar 文件放置在任何通常的扩展目录中。还可以通过将提供程序添加到应用程序的类路径或通过其他一些特定于平台的方式来提供提供程序。
为了加载,服务由单个类型表示,即单个接口或抽象类。(可以使用具体类,但不建议这样做。给定服务的提供者包含一个或多个具体类,这些类使用特定于提供者的数据和代码来扩展此 服务类型 。 provider 类 通常不是整个 provider 本身,而是一个代理,它包含足够的信息来决定 provider 是否能够满足特定请求,以及可以按需创建实际 provider 的代码。提供程序类的详细信息往往是高度特定于服务的;没有单个类或接口可以统一它们,因此此处没有定义此类类型。此功能强制执行的唯一要求是提供程序类必须具有零参数构造函数,以便可以在加载期间实例化它们。
通过在资源目录 META-INF/ services 中放置 provider-configuration 文件来标识服务提供者。该文件的 name 是服务类型的完全限定的二进制名称。该文件包含具体提供程序类的完全限定二进制名称列表,每行一个。每个名称周围的空格和 Tab 字符以及空行将被忽略。注释字符为 ‘#’ (‘\u0023’, 数字符号);在每一行中,第一个注释字符之后的所有字符都将被忽略。该文件必须以 UTF-8 编码 - 划重点
- 该文件必须以 UTF-8 编码
- 注释为#号
- 资源目录 META-INF/ services
SpringWeb就是用这种方式把Bean相关信息注入进去的
