`
hdxiong
  • 浏览: 378094 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hello ServiceLoader

    博客分类:
  • Java
阅读更多
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文件。如下图:

META-INF/services下文件的内容是接口实现类的全称(包名.接口实现类),多个实现类以换行隔开。如下图:

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



  • 大小: 5.5 KB
  • 大小: 1016 Bytes
  • 大小: 12 KB
分享到:
评论

相关推荐

    openwrt可用helloworld程序

    《OpenWrt中的Hello, World程序详解》 OpenWrt是一个基于Linux的嵌入式操作系统,广泛应用于无线路由器和其他物联网设备。它提供了高度定制化的环境,允许开发者深度定制设备的功能。在OpenWrt环境中编写和运行...

    Helloworld_helloworld_

    在编程世界中,"Hello, World!"程序是一个经典的起点,用于教授新手如何在特定的编程语言中编写并运行他们的第一个程序。这个简单的程序通常只包含一行代码,用于在控制台上打印出 "Hello, World!" 这个字符串。在这...

    hello TV电脑安装包

    【标题】"hello TV电脑安装包"所涉及的知识点主要集中在电视软件的电脑版安装上。Hello TV是一款可能用于在个人计算机上观看电视节目的应用软件。它为用户提供了在电脑上享受电视直播或者点播内容的可能性,尤其适用...

    OpenWrt之helloworld程序

    在这个"OpenWrt之helloworld程序"中,我们将探讨如何在OpenWrt环境中编写、编译和运行一个简单的 HelloWorld 程序,这将帮助初学者了解OpenWrt的开发流程。 首先,`helloworld` 文件通常是一个C或C++源代码文件,...

    String a="hello" String b="hello" a==b 返回true的问题分析

    String a="hello world"; //在java中有一个常量池,当创建String 类型的引用变量给它赋值时,java会到它的常量池中找"hello world"是不是在常量池中已存在。如果已经存在则返回这个常量池中的"hello world"的地址...

    戴尔Windowshello驱动程序

    戴尔Windowshello驱动程序,用于Windows hello 摄像头驱动安装

    hello模块驱动程序

    "hello模块"是一个经典的入门级驱动程序,主要用于帮助初学者理解Linux内核模块的基本工作原理和开发流程。这个压缩包文件包含了一个简单的"hello模块"Linux驱动程序及其对应的Makefile文件,用于在Fedora 14环境下...

    hello_helloworld_

    标题中的"hello_helloworld_"可能是指一个简单的C++程序,用于在控制台上打印经典的"Hello, World!"消息。这个程序通常被用作编程语言的基本入门示例,展示如何编写、编译和运行基本代码。 在描述中提到的“向...

    hellokitty鼠标指针

    在IT领域,个性化和定制化始终是用户追求的一部分,而"hellokitty鼠标指针"就是一个典型的例子,它允许用户将自己的计算机操作环境变得更加有趣和个性化。这个主题将鼠标的默认外观替换为广受欢迎的卡通角色Hello ...

    Hello_World.zip_hello world _world

    标题中的"Hello_World.zip_hello world _world"和描述中的"hello world prog for begginer"都指向了一个经典的编程入门示例——“Hello, World!”程序。这个简单的程序是许多编程语言教学的第一课,用于向初学者介绍...

    java_hello_world源代码工程.rar

    Java "Hello, World" 是初学者接触编程时最常见的示例,它展示了如何在Java环境中编写、编译和运行一个简单的程序。这个名为 "java_hello_world源代码工程" 的压缩包文件,显然包含了这样一个基础示例的完整源代码...

    Hello World.rar_c++ hello world_world

    在编程世界中,"Hello, World!" 是每个初学者接触的第一个程序,它标志着编程旅程的开始。本主题将深入探讨如何使用C++语言编写这个经典的 "Hello, World!" 程序,以及C++的基本语法和环境配置。 C++ 是一种强类型...

    一个简单的qt版helloworld程序

    本压缩包包含的“一个简单的qt版helloworld程序”是初学者接触Qt编程的一个基础示例,旨在帮助理解Qt的基本语法和项目构建过程。 首先,让我们来理解一下Qt中的"Hello, World!"程序的基本结构。在Qt中,我们通常会...

    加域的Win10电脑不能运行windows Hello的解决方法

    Windows Hello 在加域 Win10 电脑上的应用解决方案 Windows Hello 是 Windows 10 操作系统的一项功能,可以使用生物特征登录,如指纹、面部识别、虹膜扫描等。然而,在加域的 Win10 电脑上,Windows Hello 可能无法...

    Arduino 例程详细教学1.Hello World

    Arduino 例程详细教学1.Hello WorldArduino 例程详细教学1.Hello WorldArduino 例程详细教学1.Hello WorldArduino 例程详细教学1.Hello WorldArduino 例程详细教学1.Hello WorldArduino 例程详细教学1.Hello ...

    springboot-helloworld.rar

    《SpringBoot HelloWorld初探》 在当今的Java开发领域,SpringBoot框架因其简化Spring应用的初始搭建以及开发过程而备受青睐。"springboot-helloworld.rar"这个压缩包,显然是一个入门级的示例,旨在帮助开发者快速...

    汇编语言实现输出helloworld

    根据给定的文件信息,我们可以总结出以下关于“汇编语言实现输出HelloWorld”的相关知识点: ### 汇编语言简介 汇编语言是一种低级编程语言,它为每种类型的计算机提供了一对一的机器指令映射。汇编语言程序通常由...

    《HELLO FPGA》-项目进阶篇v2.0.zip_FPGA项目_HELLO FPGA_HelloFPGA_hellofpga

    hello fpga 项目进阶篇 电子版下载

    hello world.jar

    hello world java编程

    深入淺出Hello World ( HackingHelloWorld-PartI)

    ### 深入淺出Hello World —— Hacking HelloWorld (Part I) #### 概述 在《深入淺出Hello World》这一系列文章中,作者Jim Huang(黃敬群/"jserv")通过深入剖析经典的“Hello World”程序,旨在帮助读者理解在...

Global site tag (gtag.js) - Google Analytics