参考
1. 概述
Java 6引入了一项功能,用于发现和加载与给定接口匹配的实现:服务提供者接口(SPI)。
在本教程中,我们将介绍Java SPI的组件,并展示如何将其应用于实际用例。
2. Java SPI的术语和定义
Java SPI定义了四个主要组件
2.1 Service
一组著名的编程接口和类,提供对某些特定应用程序功能或特性的访问。
2.2 服务提供者接口
充当服务的代理或终结点的接口或抽象类。 如果服务是一个接口,则它与服务提供者接口相同。 服务和SPI一起在Java生态系统中被称为API。
2.3 服务提供者
SPI的特定实现。 服务提供者包含一个或多个实现或扩展服务类型的具体类。
服务提供者通过提供者配置文件进行配置和标识,我们将其放置在资源目录META-INF/services中。 文件名是SPI的完全限定名称,其内容是SPI实现的完全限定名称。
服务提供程序以扩展名的形式安装,这是一个jar文件,我们将其放置在应用程序类路径,Java扩展类路径或用户定义的类路径中。
2.4. ServiceLoader
SPI的核心是ServiceLoader类。这具有延迟发现和加载实现的作用。它使用上下文类路径定位提供程序实现,并将其放入内部缓存中。
3. Java生态系统中的SPI示例
Java提供了许多SPI。以下是服务提供者接口及其提供的服务的一些示例:
- CurrencyNameProvider:为Currency类提供本地化的货币符号。
- LocaleNameProvider:提供Locale类的本地化名称。
- TimeZoneNameProvider:为TimeZone类提供本地化的时区名称。
- DateFormatProvider:提供指定语言环境的日期和时间格式。
- NumberFormatProvider:为NumberFormat类提供货币,整数和百分比值。
- Driver::从4.0版开始,JDBC API支持SPI模式。较旧的版本使用Class.forName()方法加载驱动程序。
- PersistenceProvider:提供JPA API的实现。
- JsonProvider:提供JSON处理对象。
- JsonbProvider:提供JSON绑定对象。
- Extension:提供CDI容器的扩展。
- ConfigSourceProvider:提供用于检索配置属性的源。
4. 示例:货币汇率应用程序
现在我们了解的基础知识,让我们描述了建立一个汇率应用程序所需的步骤。
为了突出这些步骤,我们需要使用至少三个项目:exchange-rate-api,exchange-rate-impl,和exchange-rate-app。