Hello ServiceLoader

ServiceLoader 类
 
Java SE 6 平台提供一个新的 API,可以帮助您查找、加载和使用服务提供程序。从 Java 平台的 1.3 版本开始, java.util.ServiceLoader 类就已经悄悄存在了,但它在 Java SE 6 中已经成为了一个公共 API。

ServiceLoader 类用于在应用程序的类路径或运行时环境的扩展目录中搜索服务提供程序。它加载这些服务提供程序,并允许应用程序使用这些提供程序的 API。如果添加了新的提供程序到类路径或运行时扩展目录中, ServiceLoader 类就可以找到它们。如果应用程序知道提供程序接口的存在,它就可以找到并使用该接口的各种实现。可以使用接口的首个可加载实例,或者甚至可以迭代所有可用的接口。

ServiceLoader 类是 final 类型的,这表示您不能继承或重载其加载算法。例如,您不能把它的算法修改为从另一个位置搜索服务。

从 ServiceLoader 类的角度而言,所有服务都有一个类型,通常为接口或抽象类。提供程序本身包含一个或多个具体类,可借助特定实现来扩展服务类型。 ServiceLoader 类要求已公开的提供程序类型有一个默认构造函数,可以不带参数。这样, ServiceLoader 类便可以方便地实例化所找到的服务提供程序。

定义服务提供程序的方法是实现服务提供程序 API。通常,您会创建一个 JAR 文件来保存提供程序。要注册提供程序,必须在 JAR 文件的 META-INF/services 目录中创建一个提供程序配置文件。配置文件的名称应该是服务类型的完全限定二进制名称。 二进制名称 就是完全限定的类名,名称的每个组成部分由 . 字符分隔,而嵌套类则由 $ 字符分隔。

例如,如果实现了 com.example.dictionary.spi.Dictionary 服务类型,您应该创建一个 META-INF/services/com.example.dictionary.spi.Dictionary 文件。该文件中将在单独的一行中列出具体实现的完全限定二进制名称。该文件必须为 UTF-8 编码。另外,您还可以在文件中包含注释行,只要在注释行的开始处加上 # 字符即可。

服务加载程序将会忽略相同配置文件或其他配置文件中重复的提供程序类名。尽管您极有可能把配置文件与提供程序类本身放在同一个 JAR 文件中,这并没有限制为必须这样做。然而,在开始用于定位配置文件的同一个类加载程序中,必须能够访问提供程序。

提供程序是随需定位和实例化的。服务加载程序为已加载提供程序维护了一块缓存。加载程序的 iterator 方法的每次调用都会返回一个迭代器,它会首先生成缓存的所有元素。接着,它会找到并实例化任何新的提供程序,并依次把它们添加到缓存中。使用 reload 方法可以清除提供程序缓存。

要为特定类创建加载程序,将类本身提供给 load 或 loadInstalled 方法。您可以使用默认的类加载程序或提供自己的 ClassLoader 子类。.

loadInstalled 方法用于搜索已安装运行时提供程序的运行时环境目录。默认的扩展位置是运行时环境的 jre/lib/ext 目录。应该只对知名的、受信任的提供程序使用扩展位置,因为这个位置将成为所有应用程序的类路径。在本文中,提供程序不会使用扩展目录,但会依赖一个特定于应用程序的类路径作为代替。

代码如下:
新建一个JAVA工程,写好接口与实现类;新建 META-INF/services(固定不变)文件夹,在该文件夹下建一个没有后缀的文件,名字命名规则“ 包名.接口名”;将该工程打包成jar文件。如下图:
Hello ServiceLoader
META-INF/services下文件的内容是接口实现类的全称(包名.接口实现类),多个实现类以换行隔开。如下图:

将打包后的jar文件加入新工程的classpath中进行调用。如下图:
Hello ServiceLoader


你可能感兴趣的:(应用服务器,算法,ext)