java spi实现
当服务提供者(provider),提供一个接口多种实现时,
- 在jar包的META-INF/services/目录下创建该接口的全限名文件,文件里面的内容就是该服务接口的具体实现类的名称,而当外部加载这个 模块时,就能通过该jar包META-INF/services/里的配置文件得到具体实现类名,并加载实例化,完成模块的装配
//Command.java
package com.soa.other.spi;
public interface Command {
void execute();
}
//ShutdownCommand
package com.soa.other.spi;
public class ShutdownCommand implements Command{
@Override
public void execute() {
System.out.println("Shutdown");
}
}
// StartCommand
package com.soa.other.spi;
public class StartCommand implements Command {
@Override
public void execute() {
System.out.println("Start");
}
}
//Main调用类
package com.soa.other.spi;
import java.util.ServiceLoader;
public class Main {
public static void main(String[] args) {
ServiceLoader<Command> serviceLoader = ServiceLoader.load(Command.class);
for (Command command : serviceLoader) {
command.execute();
}
}
}
弊端(相比与dubbo的spi):
1.一次性加载
2.全部加载,没有用到也要会加载
3.没有AOP/IOC的支持