• JDK 自带的服务发现框架 ServiceLoader 好用吗?


    学习路线图:

    1. 认识服务发现?

    1.1 什么是服务发现

    服务发现(Service Provider Interface,SPI)是一个服务的注册与发现机制,通过解耦服务提供者与服务使用者,实现了服务创建 & 服务使用的关注点分离。服务提供模式可以为我们带来以下好处:

    • 1、在外部注入或配置依赖项,因此我们可以重用这些组件。当我们需要修改依赖项的实现时,不需要大量修改很多处代码,只需要修改一小部分代码;
    • 2、可以注入依赖项的模拟实现,让代码测试更加容易。

    服务发现示意图

    1.2 服务发现和依赖注入的区别

    服务发现和依赖注入都是控制反转 Ioc 的实现形式之一。IoC 可以认为是一种设计模式,但是由于理论成熟的时间相对较晚,所以没有包含在《设计模式 · GoF》之中,即: 当依赖方需要使用依赖项时,不再直接构造对象,而是由外部 IoC 容器来创建并提供依赖。

    • 1、服务提供模式: 从外部服务容器抓取依赖对象,调用方可以 “主动” 控制请求依赖对象的时机;
    • 2、依赖注入: 并以参数的形式注入依赖对象,调用方 “被动” 接收外部注入的依赖对象。

    2. JDK ServiceLoader 的使用步骤

    在分析 ServiceLoader 的使用原理之前,我们先来介绍下 ServiceLoader 的使用步骤。

    我们直接以 JDBC 作为例子,其中「2、连接数据库」内部就是用了 ServiceLoader。为什么连接数据库需要使用 SPI 设计思想呢?因为操作数据库需要使用厂商提供的数据库驱动程序,如果直接使用厂商的驱动耦合太强了,而使用 SPI 设计就能够实现服务提供者与服务使用者解耦。

    以下为使用步骤,具体分为 5 个步骤:

    • 1、(非必须)执行数据库驱动类加载:
    Class.forName("com.mysql.jdbc.driver")
    • 2、连接数据库:
    DriverManager.getConnection(url, user, password)
    • 3、创建SQL语句:
    Connection#.creatstatement();
    • 4、执行SQL语句并处理结果集:
    Statement#executeQuery()
    • 5、释放资源:
    ResultSet#close()
    Statement#close()
    Connection#close()

    下面,我们一步步手写 JDBC 中关于 ServiceLoader 的相关源码:

    步骤 1:定义服务接口

    定义一个驱动接口,这个接口将由数据库驱动实现类实现。在服务发现框架中,这个接口就是服务接口。

    public interface Driver {
        // 创建数据库连接
        Connection connect(String url, java.util.Properties info);
        ...
    }

    步骤 2:实现服务接口

    数据库厂商提供一个或多个实现 Driver 接口的驱动实现类,以 mysql 和 oracle 为例:

    • mysql : com.mysql.cj.jdbc.Driver.java
    // 已简化
    public class Driver extends NonRegisteringDriver implements java.sql.Driver {
        static {
            // 注册驱动
            java.sql.DriverManager.registerDriver(new Driver());
        }
        ...
    }
    • oracle : oracle.jdbc.driver.OracleDriver.java
  • 相关阅读:
    【AGC】如何快速部署Serverless抽奖模板
    Guava中这些Map的骚操作,让我的代码量减少了50%
    利用cookie实现记住密码功能
    Day09-尚品汇-detail路由组件展示商品售卖属性-剪裁
    精通Nginx(14)-配置HTTPS
    【DesignMode】装饰者模式(Decorator pattern)
    香港金融交易解决方案提供商【移动财经】申请840美元纳斯达克IPO上市
    走好这六步,成为网络安全工程师一路畅通无阻
    这样做时间轴,让你的PPT更出彩!
    翻译工具-翻译工具下载批量自动一键翻译免费
  • 原文地址:https://blog.csdn.net/Q54665642ljf/article/details/126747581