美文网首页
Java SPI 与 Dubbo SPI 一点点区别

Java SPI 与 Dubbo SPI 一点点区别

作者: 赵信信官属 | 来源:发表于2024-06-01 15:02 被阅读0次

网络上经常会有这样的说法, Java SPI会将接口的所有实现类都实例化, 而Dubbo SPI机制会按需实例化.
如下图所示, 数据库的驱动管理类, java.sql.DriverManager 根据Java SPI机制, 的确会加载所有的实现类并实例化它们.

图片.png

然而, 我们是否可以只把部分实现类实例化呢?

代码

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 "惠普电脑";
    }
}
图片.png

如上,一个接口两个实现 , 以及 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机制不同, 虽然它可以按需实例化. 但是它已经把接口的所有实现类都类加载了.

相关文章

网友评论

      本文标题:Java SPI 与 Dubbo SPI 一点点区别

      本文链接:https://www.haomeiwen.com/subject/qbhjqjtx.html