• Java SPI 机制实现解耦与本地化


    SPI 是 Java 提供的一种服务加载方式,全名为 Service Provider Interface,可以避免在 Java 代码中写死服务的提供者,而是通过 SPI 服务加载机制进行服务的注册和发现。通过这种方式,可以基于接口编程,实现多个模块的解耦。

    SPI 机制实现解耦

    如下的示例展示了通过 ServiceLoader 类加载指定接口的所有服务提供者并进行调用的简单实现。

    1、定义接口 test.DirMonitor,包含一个方法 start();

    2、实现接口 test.DirMonitor,定义两个实现类 test.ObserverMonitor 和 test.LoopMonitor;

    3、设置接口的实现类列表。创建目录 META-INF/services/,新建文件 test.DirMonitor,内容如下:

    test.ObserverMonitor

    test.LoopMonitor

    4、在程序中通过 ServiceLoader 类加载 test.DirMonitor 接口的实现类,并遍历所有实现类,调用 start() 方法;

    从上面的示例可以看出,在代码中仅仅使用到了接口 test.DirMonitor,并没有在代码中使用到具体实现类。通过这种方法,可以实现解耦,接口与实现类可以由不同的开发人员实现,编译到不同的 jar 包中,甚至实现插件的定义与开发。

    spi 包的本地化扩展

    java.util.spi 包提供了一些抽象类,可以用于扩展 Java 的本地化服务。本地化 SPI 的使用方法与 ServiceLoader 的 SPI 稍有不同,本地化 SPI 的实现需要打包成 jar 包后,放置于运行的 jre/lib/ext 目录下方能生效。

    java.util.spi 包提供的抽象类如下所示:

    CalendarDataProvider:为 java.util.Calendar 类的参数提供本地化数据的服务提供者的抽象类;

    CalendarNameProvider:为 java.util.Calendar 类的字段提供本地化名称的服务提供者的抽象类;

    CurrencyNameProvider:为 java.util.Currency 提供本地化货币符号名称的服务提供者的抽象类;

    LocaleNameProvider:为 java.util.Locale 类提供本地化名称的服务提供者的抽象类;

    LocaleServiceProvider:其他服务提供者抽象类的基类;

    ResourceBundleControlProvider:服务接口,用于提供 java.util.ResourceBundle.Control 的实现类;

    TimeZoneNameProvider:为 java.util.TimeZone 提供本地化时区的服务提供者的抽象类。

    以 CalendarDataProvider 为例,该抽象类用于实现本地化的日历数据。在下面的例子中,CalendarDataProviderSPI 类设置了每周的第一天为 3,一年中第一周所需的最少天数为 6。

    按照 SPI 的要求,在 META-INF/services/ 下建立 java.util.spi.CalendarDataProvider 文件,并写入 testspi.CalendarDataProviderSPI。打包为 jar 后,放置于 jre/lib/ext 目录后,执行下面的代码,则打印的数字分别为 3 和 6,而不再是默认的 1 和 1。

    总结

    Java 通过 SPI 机制为我们提供了一种服务发现机制。通过在 META-INF/services/ 目录下创建以接口全限定名为名称的文件,并在文件中每行写入一个服务提供者的全限定名,Java 可以发现并创建服务提供者的实例。

    通过 ServiceLoader 我们可以获取指定接口的所有服务提供者,并实现接口调用与服务提供者的解耦。通过实现 spi 包的抽象接口,并放置于 jre/lib/ext 目录下,可以实现 Java 的本地化。

    原文地址:Java SPI 机制实现解耦与本地化

  • 相关阅读:
    edu_2_4_1
    edu_2_3_2
    edu_2_3_1
    edu_2_2_2
    edu_2_1_1
    edu_2_2_1
    hdu 1270 小希的数表
    hdu 2151 worm
    hdu1089 Ignatius's puzzle
    hdu 2190 悼念512汶川大地震遇难同胞——重建希望小学
  • 原文地址:https://www.cnblogs.com/chengxuzhixin/p/6624353.html
Copyright © 2020-2023  润新知