Java SPI具体约束规范:
1: 提供一个开放式的服务接口,任何人都可以实现这个接口
2: 实现接口的工程的META-INF/services/目录下,创建一个以接口全类名为名称的文件,文件内容为接口的实现类的全类名
注意:1 接口实现类必须有无参的构造函数
2 如果有多个实现类,文件一行一个实现类
3: 可以使用 ServiceLoad类加载接口的实现类
案例:
1 - 定义一个接口类
package com.roger.spi;
public interface ILogService {
public void info(String message);
}
2 - 为接口定义实现类
package com.roger.spi.impl;
import com.roger.spi.ILogService;
public class RealLogServiceImpl implements ILogService {
@Override
public void info(String message) {
System.out.println("真正的日志打印类,接收的消息是:" + message);
}
}
package com.roger.spi.impl;
import com.roger.spi.ILogService;
public class CommonLogServiceImpl implements ILogService {
@Override
public void info(String message) {
System.out.println("接收的日志消息是:" + message);
}
}
3 - 创建 以 com.roger.spi.ILogService 为文件名的文件 目录是META-INFO/services ,注意编译后在classpath路径下
文件内容为:
com.roger.spi.impl.CommonLogServiceImpl
com.roger.spi.impl.RealLogServiceImpl
4 - 使用案例:
package com.roger.spi;
import java.util.ServiceLoader;
public class SpiMain {
public ServiceLoader<ILogService> serviceloader = ServiceLoader.load(ILogService.class);
public static void main(String[] args) {
SpiMain spiMain = new SpiMain();
spiMain.getILogService();
}
private void getILogService() {
for (ILogService iLogService:serviceloader) {
iLogService.info("Test SPI 约定...");
}
}
}
执行结果: