前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >作为Java程序员,SPI和API傻傻分不清?

作为Java程序员,SPI和API傻傻分不清?

作者头像
xiaoyi
发布2024-04-10 16:06:38
670
发布2024-04-10 16:06:38
举报
文章被收录于专栏:小义思小义思

作为Java开发者,你或许在开发过程中经常与API打交道,同时也可能听说过SPI。今天我们就来详细探讨一下这两个概念的区别和它们在Java编程中的应用。

API:开发者的枢纽

API(Application Programming Interface)全称是应用程序编程接口,它是一组预定义的方法和工具,用于构建应用程序软件。它能够让我们的应用软件利用另一套软件的功能,而不必了解其内部工作机制。它就像是一家餐馆的菜单,客户(开发者)根据菜单(API文档)点菜(调用API)即可。

API的特点:

  • 提供了固定的“接口”供开发者调用
  • 隐藏了内部实现的复杂性
  • 侧重于接口调用的简便性和实现的稳定性

举个例子,Java中的 Collections.sort() 方法就是一个API。开发者只需知道它能够对集合进行排序,而排序的具体实现(比如快排、归并等算法)则被封装起来。

SPI:背后的实现者

SPI(Service Provider Interface),服务提供者接口,与API相比,它更偏重于框架和平台的后端服务。SPI允许第三方厂商或开发者来提供某一特定服务的实现。

SPI的特点:

  • 定义了拓展点,允许多种实现方式共存
  • 服务提供商依据SPI来提供服务
  • 与平台的耦合性较低,有利于实现模块化

以Java的java.util.ServiceLoader为例,它是一个典型的SPI。它不直接提供服务,而是定义了一种服务加载的机制,允许程序动态加载服务的实现。

SPI和API的关键性区别

虽然API和SPI有着相似之处,主要性区别在于它们所针对的对象与目的。

  • 定位差异:API主要面向最终用户,是实际调用服务的“前端”;SPI则面向实现者,是提供服务实现细节的“后台”。
  • 目标不同:API的目标是提供一套易于使用的工具集以便于调用,而SPI的目标则是为这些工具集提供多样化的、可插拔的实现。
  • 稳定性与灵活性的平衡:API强调接口的稳定性与一致性;SPI则提供了更多的灵活性,在不改变API的情况下支持新的服务实现。

实际应用场景

在Java中将API和SPI结合使用是一种常见的设计模式。例如,JDBC(Java数据库连接)API定义了连接数据库所需的所有方法,而各个数据库厂商则通过SPI提供了这些方法的具体实现。这允许开发者在不改变代码的情况下切换不同的数据库驱动。

Spring中的SPI

SPI作为JDK提供的一种服务提供发现机制,具有很强的可扩展性,因此很多主流框架也充分运用了这一技术,以下是Spring框架中一些典型使用SPI的例子:

  1. BeanFactory SPI

Spring的BeanFactory就是一个服务提供接口(SPI)的例子,它为Spring容器中的bean管理定义了一套复杂的机制。具体来说,ApplicationContext就是基于BeanFactory SPI的一个高级实现,它除了提供BeanFactory的简单容器功能外,还添加了国际化、事件传播、资源加载等企业级特性。

  1. Transaction SPI

Spring的事务管理SPI,由PlatformTransactionManager接口定义,允许开发者配置和使用不同的事务管理策略。不同的数据访问技术和数据库,如JDBC、JPA、Hibernate等,通过不同的PlatformTransactionManager实现进行适配,这让事务管理具有很高的灵活性。

  1. AOP SPI

Spring的面向切面编程(AOP)功能也是通过一组SPI实现的。这些SPI包括MethodInterceptor、JoinPoint等,都是AOP Alliance提供的接口,可以用于创建通用的AOP联盟合规切面。通过实现这些接口,开发者可以注入额外的行为到方法执行流程中。

  1. 数据访问异常的转换

Spring提供了一个名为PersistenceExceptionTranslationPostProcessor的Bean后处理器,它使用SPI来将JPA、Hibernate等ORM框架抛出的数据访问异常转换为Spring的数据访问异常体系,这是通过实现PersistenceExceptionTranslator接口完成的,使得异常处理在Spring框架中更为一致。

  1. 支持多种视图解析技术

在Spring MVC中, ViewResolver接口是用于解决视图名称到视图实现的映射,开发者可以实现这个SPI来支持不同的视图技术,如JSP、FreeMarker、Thymeleaf等。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-03-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员小义 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • API:开发者的枢纽
  • SPI:背后的实现者
  • SPI和API的关键性区别
  • 实际应用场景
  • Spring中的SPI
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档