美文网首页
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