public class ServiceRegistry extends Object
一个服务是一组众所周知的接口(通常是抽象的)类。 服务提供商是服务的具体实现。 提供者中的类通常实现接口或子类化服务本身定义的类。
 服务提供商存储在一个或多个类别中 ,每个类别由其所有成员必须实现的一类接口(由类对象描述)定义。 可以动态地更改类别集合。 
 只有一个给定叶类的一个实例(也就是getClass()返回的实际类,而不是任何继承的类或接口)可以被注册。 也就是说,假设com.mycompany.mypkg.GreenServiceProvider类实现了com.mycompany.mypkg.MyService接口。 如果注册了一个GreenServiceProvider实例,它将被存储在由MyService类定义的类别中。 如果一个新的实例GreenServiceProvider注册,它将替换以前的实例。 实际上,服务提供商对象通常是单身,因此这种行为是合适的。 
 要声明服务提供商, services子目录将放置在每个JAR文件中存在的META-INF目录中。 此目录包含每个服务提供程序接口的文件,该接口在JAR文件中具有一个或多个实现类。 例如,如果JAR文件包含了一个名为类com.mycompany.mypkg.MyServiceImpl它实现了javax.someapi.SomeService接口,JAR文件将包含一个文件名为: 
  META-INF/services/javax.someapi.SomeService  
       包含行: 
         com.mycompany.mypkg.MyService  
       服务提供商类应该是轻量级的,并且加载速度快。 这些接口的实现应避免对其他类和本地代码的复杂依赖。 更复杂服务的通常模式是为重量级服务注册轻量级代理。
只要具有适当的运行时权限,应用程序就可以自定义注册表的内容。
有关声明服务提供商的更多详细信息,以及JAR格式,请参阅JAR File Specification 。
RegisterableService 
       | Modifier and Type | Class and Description | 
|---|---|
| static interface  | ServiceRegistry.Filter
              通过使用一个简单的过滤器接口 
              ServiceRegistry.getServiceProviders选择提供商任意条件匹配的。 | 
| Constructor and Description | 
|---|
| ServiceRegistry(Iterator<类<?>> categories)
              构造一个 
              ServiceRegistry实例,其中一组类别取自categories参数。 | 
| Modifier and Type | Method and Description | 
|---|---|
| boolean | contains(Object provider)
              返回 
              true如果provider当前注册。 | 
| void | deregisterAll()
              取消注册所有类别的所有当前注册服务提供商。 
             | 
| void | deregisterAll(类<?> category)
              取消注册目前在给定类别下注册的所有服务提供商对象。 
             | 
| void | deregisterServiceProvider(Object provider)
              从包含它的所有类别中删除服务提供商对象。 
             | 
| <T> boolean | deregisterServiceProvider(T provider, 类<T> category)
              从给定的类别中删除服务提供者对象。 
             | 
| void | finalize()
              在垃圾收集之前完成此对象。 
             | 
| Iterator<类<?>> | getCategories()
              返回一个 
              Iterator个类对象,指示当前的一组类别。 | 
| <T> T | getServiceProviderByClass(类<T> providerClass)
              返回给定类类型的当前注册的服务提供者对象。 
             | 
| <T> Iterator<T> | getServiceProviders(类<T> category, boolean useOrdering)
              返回一个 
              Iterator包含给定类别中所有已注册的服务商。 | 
| <T> Iterator<T> | getServiceProviders(类<T> category, ServiceRegistry.Filter filter, boolean useOrdering)
              返回 
              Iterator一个给定类别中满足由所提供的定义的条件的含服务提供程序对象ServiceRegistry.Filter对象的filter方法。 | 
| static <T> Iterator<T> | lookupProviders(类<T> providerClass)
              使用上下文类加载器定位并递增实例化给定服务的可用提供程序。 
             | 
| static <T> Iterator<T> | lookupProviders(类<T> providerClass, ClassLoader loader)
              使用给定的类加载器搜索特定服务类的实现。 
             | 
| void | registerServiceProvider(Object provider)
              将服务提供者对象添加到注册表。 
             | 
| <T> boolean | registerServiceProvider(T provider, 类<T> category)
              将服务提供者对象添加到注册表。 
             | 
| void | registerServiceProviders(Iterator<?> providers)
              添加一组从 
              Iterator到注册表的服务提供者对象。 | 
| <T> boolean | setOrdering(类<T> category, T firstProvider, T secondProvider)
              在给定类别中的两个服务提供者对象之间设置成对排序。 
             | 
| <T> boolean | unsetOrdering(类<T> category, T firstProvider, T secondProvider)
              在给定类别中的两个服务提供者对象之间设置成对排序。 
             | 
public ServiceRegistry(Iterator<类<?>> categories)
ServiceRegistry实例,其中包含一组从 
           categories参数获取的 
           categories 。 
          categories - 一个 
            Iterator包含用于定义类别的 
            类对象。 
           IllegalArgumentException - 如果 
            categories是 
            null 。 
           public static <T> Iterator<T> lookupProviders(类<T> providerClass, ClassLoader loader)
 此方法将给定服务类的名称转换为类注释中所述的提供者配置文件名,然后使用给定类加载器的getResources方法查找具有该名称的所有可用文件。 然后读取和解析这些文件以产生一个提供者类名称列表。 返回的迭代器使用给定的类加载器来查找列表中的每个元素,然后实例化。 
因为可以将扩展安装到正在运行的Java虚拟机中,所以每次调用此方法时都可能会返回不同的结果。
T - 
            T的类型。 
           providerClass - 一个 
            类对象,指示正在检测到的服务提供商的类或接口。 
           loader -类加载器用于加载提供者配置文件和实例化提供者类,或 
            null如果要使用的系统类加载器(或,如若不然引导类加载器)的。 
           Iterator以某种任意顺序产生给定服务的提供者对象。 
            迭代器都将抛出一个Error如果提供者配置文件违反指定的格式,或者如果一个供应商类不能被发现和实例化。 
           IllegalArgumentException - 如果 
            providerClass是 
            null 。 
           public static <T> Iterator<T> lookupProviders(类<T> providerClass)
  ClassLoader cl = Thread.currentThread().getContextClassLoader();
   return Service.providers(service, cl);  
          T - 
            T的类型。 
           providerClass - 一个指示所检测到的服务提供商的类或接口的 
            类对象。 
           Iterator以某种任意顺序产生给定服务的提供者对象。 
            迭代器都将抛出一个Error如果提供者配置文件违反指定的格式,或者如果一个供应商类不能被发现和实例化。 
           IllegalArgumentException - 如果 
            providerClass是 
            null 。 
           public Iterator<类<?>> getCategories()
Iterator的类对象,指示当前的类别集。 
           如果没有类别,迭代器将为空。 
          Iterator包含 
            类对象。 
           public <T> boolean registerServiceProvider(T provider,
                                           类<T> category) 
           如果provider实现了RegisterableService接口,则会调用其onRegistration方法。 每当它从类别中注销时,将会调用其onDeregistration方法,例如,如果某个类别被删除或注册表被垃圾回收。 
T - 提供者的类型。 
           provider - 服务提供要注册的对象。 
           category - 注册提供者的类别。 
           IllegalArgumentException - 如果 
            provider是 
            null 。 
           IllegalArgumentException - 如果没有类别对应 
            category 。 
           ClassCastException - 如果提供者没有实现由 
            类定义的 
            category 。 
           public void registerServiceProvider(Object provider)
类的注册表中存在的每个类别中关联。 
            如果provider实现了RegisterableService接口,则其onRegistration方法将在其onRegistration的每个类别被调用一次。 它的onDeregistration方法将在每次从类别注销时或注册表完成时被调用。 
provider - 要注册的服务提供商对象。 
           IllegalArgumentException - 如果 
            provider是 
            null 。 
           public void registerServiceProviders(Iterator<?> providers)
Iterator到注册表。 
           每个提供者在其类的注册表中存在的每个类别中关联。 
            对于实现providers接口的RegisterableService每个条目,其onRegistration方法对于其onRegistration的每个类别将被调用一次。 它的onDeregistration方法将在每次从类别注销或注册表完成时被调用。 
providers - 一个包含要注册的服务提供商对象的迭代器。 
           IllegalArgumentException - 如果 
            providers是 
            null或包含一个 
            null条目。 
           public <T> boolean deregisterServiceProvider(T provider,
                                             类<T> category) 
          false 。 
           否则返回true 。 
           如果与provider相同但不相等(使用== )至provider被注册,则不会被注销。 
            如果provider实现了RegisterableService接口,则会调用其onDeregistration方法。 
T - 提供者的类型。 
           provider - 要注销的服务提供商对象。 
           category - 从中注销提供者的类别。 
           true如果提供商以前注册在同一类别类别中, 
            false false。 
           IllegalArgumentException - 如果 
            provider是 
            null 。 
           IllegalArgumentException - 如果没有类别对应 
            category 。 
           ClassCastException - 如果提供程序不实现由 
            category定义的类。 
           public void deregisterServiceProvider(Object provider)
provider - 要注销的服务提供商对象。 
           IllegalArgumentException - 如果 
            provider是 
            null 。 
           public boolean contains(Object provider)
true如果 
           provider当前注册。 
          provider - 要查询的服务提供商对象。 
           true如果给定的提供者已经注册。 
           IllegalArgumentException - 如果 
            provider是 
            null 。 
           public <T> Iterator<T> getServiceProviders(类<T> category, boolean useOrdering)
Iterator包含给定类别中所有已注册的服务商。 
           如果useOrdering为false ,则迭代器将以任意顺序返回所有服务器提供程序对象。 
           否则,订单将尊重已设置的任何成对订单。 
           如果成对订单的图形包含循环,则不会返回属于循环的任何提供程序。 
          T - 类别的类型。 
           category - 
            category的类别。 
           useOrdering - 
            true如果在订购返回的对象时应考虑成对订购。 
           Iterator来自给定类别的服务提供者对象的 
            Iterator ,可能是有序的。 
           IllegalArgumentException - 如果没有类别对应 
            category 。 
           public <T> Iterator<T> getServiceProviders(类<T> category, ServiceRegistry.Filter filter, boolean useOrdering)
Iterator一个给定类别中满足由所提供的定义的条件的含服务提供程序对象ServiceRegistry.Filter对象的filter方法。 
            useOrdering参数使用与getServiceProviders(Class, boolean)相同的规则来控制结果的排序。 
T - 类别的类型。 
           category - 
            category的类别。 
           filter - 将调用其 
            filter方法的 
            ServiceRegistry.Filter的实例。 
           useOrdering - 
            true如果在订购返回的对象时应考虑成对订购。 
           Iterator给定类别的服务提供者对象的 
            Iterator ,可能是顺序的。 
           IllegalArgumentException - 如果没有类别对应 
            category 。 
           public <T> T getServiceProviderByClass(类<T> providerClass)
null 。 
          T - 提供者的类型。 
           providerClass - 所需服务提供商对象的 
            类 。 
           类类型,或者是 
            null是不存在的。 
           IllegalArgumentException - 如果 
            providerClass是 
            null 。 
           public <T> boolean setOrdering(类<T> category, T firstProvider, T secondProvider)
false 。 
           如果提供商之前已经按相反的方向进行订购,那么该订单将被删除。 
            当他们的useOrdering参数为true时, getServiceProviders方法将使用排序。 
T - 类别的类型。 
           category - 一个 
            类对象,指示要建立偏好的类别。 
           firstProvider - 首选提供商。 
           secondProvider -提供到 
            firstProvider是优选的。 
           true如果先前未设定的顺序建立。 
           IllegalArgumentException - 如果任一提供者是 
            null或它们是相同的对象。 
           IllegalArgumentException - 如果没有类别对应 
            category 。 
           public <T> boolean unsetOrdering(类<T> category, T firstProvider, T secondProvider)
false 。 
            当他们的useOrdering参数为true时, getServiceProviders方法将使用排序。 
T - 类别的类型。 
           category - 一个 
            类对象,指示优先级将被拆除的类别。 
           firstProvider - 以前的首选提供商。 
           secondProvider -提供到 
            firstProvider以前优选的。 
           true如果先前设定的订单已经解散。 
           IllegalArgumentException - 如果任一提供者是 
            null或它们是相同的对象。 
           IllegalArgumentException - 如果没有类别对应 
            category 。 
           public void deregisterAll(类<?> category)
category - 要清空的类别。 
           IllegalArgumentException - 如果没有类别对应 
            category 。 
           public void deregisterAll()
public void finalize()
              throws Throwable 
          deregisterAll方法被要求取消注册所有当前注册的服务提供商。 
           不应该从应用程序代码调用此方法。 
          finalize在 
            Object 
           Throwable - 如果超类最终化期间发生错误。 
           WeakReference, 
            PhantomReference 
            Submit a bug or feature 
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
 Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.