【问题标题】:Java SPI Usage On Non Open Source [Company Based] Project非开源 [基于公司] 项目的 Java SPI 使用
【发布时间】:2021-09-14 04:00:23
【问题描述】:

我最近了解了Java SPI,我认为只有第三方库实现接口才有用,比如slf4jjdbc [即最有可能是开源库]。如果应用程序是允许最终用户创建某事物的自定义实现的产品,它也可能很有用。

但是对于在公司开发软件,我们只向客户端公开API,并且最终客户端无权自定义任何实现,是否有任何理由使用Java SPI实现接口?

例如,假设我正在开发一个支付系统,它直接连接到不同的银行系统 [e.g. Morgan Stanley, Bank Of China, Deutsche Bank...],但是每个系统肯定会有不同的 API,也许我们的服务器需要以不同的方式处理请求和响应。因此我们必须创建一个API来封装这些信息,以便其他开发者调用这些服务,不需要关心不同银行系统之间的差异。

public interface PaymentInterface {
     String bankName();
     
     boolean pay(Customer customer, BigDecimal amount);
}

在这种情况下,我可以在同一个 Jar 中创建一个直接实现接口的方法,然后创建一个静态工厂方法,用于动态选择不同的 PaymentInterface。那就去吧。

当然,我们可以创建一个SPI,并定义META-INF/service xxx文件来指定我们在XXX和YYY中实现SPI。但是当人们无法预见未来的 SPI 实现将建立在外部 jar 上,但在同一个 jar 中。有什么理由使用 SPI?

让我重新表述一下我的问题,

程序员/公司很少使用 Java SPI 吗?除非你在做开源项目,比如springdubboslf4j

【问题讨论】:

    标签: java api service-provider


    【解决方案1】:

    以下是我的理解。也许不正确,但我希望它可以有所帮助。

    以您的案例为例,每家银行的支付方式都有不同的规则,您可以使用静态工厂或策略在您自己的代码/项目中获得您想要的具体实现。 那是因为您是设计者和实施者。

    考虑一种情况,您是该界面的设计者,而实施必须由其他团队完成,他们无法访问/更改您的代码。这个时候,我觉得SPI是个不错的选择。(或者像Spring一样,提供一种方式让自定义实现覆盖/扩展默认实现,比如@ConfigurationXXConfiguredAdaptor)。

    Framework 是一个脚手架(设计者),您正在尝试基于一些脚手架(实施者)来实现业务场景。

    【讨论】:

      【解决方案2】:

      说真的,如果您认为 SPI 在您的项目/产品中有用,请使用它。如果你不这样做,那就不要。

      使用或不使用 SPI 方法的原因完全取决于项目的技术要求,而不是取决于它是开源还是专有。

      SPI 方法是经常使用还是很少使用也不应该影响您的决策。


      如果您想了解 SPI 的(一般)优点和缺点的总结,可以在网络上提供相关资源。


      如果您担心出于法律原因不允许您提供自己的 SPI 实现(或从双方实现您自己的 SPI),我认为没有问题。 AFAIK,Oracle JDK 或 OpenJDK 许可都不会阻止您这样做。 (但如果您真的担心,请咨询专门从事知识产权法的律师。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-04
        • 1970-01-01
        • 2010-10-17
        相关资源
        最近更新 更多