网络上经常会有这样的说法, Java SPI会将接口的所有实现类都实例化, 而Dubbo SPI机制会按需实例化.
如下图所示, 数据库的驱动管理类, java.sql.DriverManager 根据Java SPI机制, 的确会加载所有的实现类并实例化它们.
然而, 我们是否可以只把部分实现类实例化呢?
代码
public interface Computer {
String getName();
}
public class DellComputer implements Computer {
@Override
public String getName() {
return "戴尔电脑";
}
}
public class HPComputer implements Computer {
@Override
public String getName() {
return "惠普电脑";
}
}
如上,一个接口两个实现 , 以及 META-INF/services目录下的文件内容
public static void main(String[] args) throws Exception {
ServiceLoader<Computer> serviceLoader = ServiceLoader.load(Computer.class);
Iterator<Computer> iterator = serviceLoader.iterator();
while (iterator.hasNext()) {
Computer next = iterator.next();
if (next.getClass().getName().contains("Dell")) {
// 找到所需要的实例之后,直接跳出
break;
}
}
}
如上,通过Java SPI机制可以只把部分实现类实例化(如果所需要的类正好处在最后一个,那么也相当于实例化了所有的实现类). 这样可以保证, 我们不需要的类没有被类加载 , 更没有被实例化. 当然了,以上代码未必实用.
但Dubbo SPI机制不同, 虽然它可以按需实例化. 但是它已经把接口的所有实现类都类加载了.