我最近了解了Java,我认为只有第三方库才能实现接口,比如slf4j
和jdbc
,也就是最有可能的开源库。如果应用程序是一个允许最终用户创建某事物的自定义实现的产品,它也可能是有用的。
,但是对于在公司中开发一个软件,我们只向客户端公开SPI,而最终客户端永远无权定制任何实现,有什么理由使用Java来实现接口呢?
比方说,我正在开发一个支付系统,它直接连接到不同的银行系统,比如摩根士丹利、中国银行、德意志银行……但是每个系统肯定会有不同的API,也许我们的服务器需要以不同的方式处理请求和响应。因此,我们必须创建一个API来包装这样的信息,这样其他开发人员就会调用这些服务,而不需要考虑不同银行系统之间的差异。
public interface PaymentInterface {
String bankName();
boolean pay(Customer customer, BigDecimal amount);
}
在这种情况下,我可以在同一个Jar中创建一个直接实现接口的方法,然后创建一个静态工厂方法,动态地选择不同的PaymentInterface。那就走吧。
当然,我们可以创建一个SPI,并定义META/service xxx文件来指定我们在XXX和YYY中实现SPI。但是,当人们无法预见SPI的未来实现时,SPI将构建在外部jar上,而是构建在同一个jar中。有什么理由使用SPI吗?
让我再重复一遍我的问题,
是程序员/公司很少使用的Java吗?除非您正在执行开源项目,如
spring
、dubbo
、slf4j
发布于 2022-02-05 03:43:11
下面是我的理解。也许不对,但我希望它能有所帮助。
以您的情况为例,每家银行的支付方式都有不同的规则,您可以使用静态工厂或策略来获得您希望在自己的代码/项目中实现的特定实现。那是因为你是设计师和实现者.
考虑一种情况,您是该接口的设计人员,而实现必须由其他团队完成,并且他们不能访问/更改您的代码。此时,我认为SPI是一个很好的选择(或者像Spring一样,提供一种方式让定制的实现覆盖/扩展默认实现,比如@Configuration
和XXConfiguredAdaptor
)。
框架是一个脚手架(Designer),您正在尝试实现基于某些脚手架(实现者)的业务场景。
发布于 2022-02-05 05:44:46
说真的,如果您认为SPI在您的项目/产品中是有用的,请使用它。如果你不知道,那就不要。
使用或不使用SPI方法的原因完全取决于您项目的技术需求,而不是它是开源还是专有的。
无论SPI方法是经常使用还是很少使用,也不应该对您的决策产生重大影响。
如果您想要总结SPI的(一般)优点和缺点,可以在web上提供这方面的资源。
如果您担心由于法律原因不能提供您自己的SPI实现(或者实现您自己的SPI),我认为没有问题。AFAIK,Oracle或OpenJDK许可都不能阻止您这样做。(但如果你真的很担心,就去问一位专门从事知识产权法的律师吧。)
https://stackoverflow.com/questions/68221101
复制相似问题