- 直接已知的子类:
-
IIORegistry
服务提供程序存储在一个或多个类别中,每个类别由一个类或接口定义(由Class对象描述),其所有成员必须实现。
此类支持的类别集仅限于以下标准图像I/O服务类型:
尝试加载不是上述类型的子类型的提供程序将导致IllegalArgumentException。
有关加载服务提供程序的一般机制,请参阅ServiceLoader,这是此类使用的基础标准机制。
只能注册给定叶类的单个实例(即由getClass()返回的实际类,而不是任何继承类或接口)。也就是说,假设com.mycompany.mypkg.GreenImageReaderProvider类是javax.imageio.spi.ImageReaderSpi的子类。如果注册了GreenImageReaderProvider实例,它将存储在由ImageReaderSpi类定义的类别中。如果注册了GreenImageReaderProvider的新实例,它将替换先前的实例。实际上,服务提供程序对象通常是单例,因此此行为是适当的。
服务提供程序类应该轻量且快速加载。这些接口的实现应避免对其他类和本地代码的复杂依赖。更复杂服务的通常模式是为重型服务注册轻量级代理。
应用程序可以根据需要自定义注册表的内容,只要具有适当的运行时权限即可。
有关如何创建和部署服务提供程序的信息,请参阅ServiceLoader上的文档
- 参见:
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic interfaceServiceRegistry.getServiceProviders使用的简单过滤器接口,用于选择符合任意条件的提供程序。 -
Constructor Summary
ConstructorsConstructorDescriptionServiceRegistry(Iterator<Class<?>> categories) 使用从categories参数中获取的一组类别构造ServiceRegistry实例。 -
Method Summary
Modifier and TypeMethodDescriptionboolean如果provider当前已注册,则返回true。void从所有类别中取消注册当前已注册的所有服务提供程序。voidderegisterAll(Class<?> category) 取消注册当前在给定类别下注册的所有服务提供程序对象。voidderegisterServiceProvider(Object provider) 从包含它的所有类别中删除一个服务提供程序对象。<T> booleanderegisterServiceProvider(T provider, Class<T> category) 从给定类别中删除一个服务提供程序对象。voidfinalize()已弃用,将来会移除:此API元素可能在将来的版本中被移除。已弃用终结。返回一个Iterator,指示当前类别集合的Class对象。<T> TgetServiceProviderByClass(Class<T> providerClass) 返回当前已注册的给定类类型的服务提供程序对象。<T> Iterator<T> getServiceProviders(Class<T> category, boolean useOrdering) 返回一个Iterator,其中包含给定类别中所有已注册的服务提供程序。<T> Iterator<T> getServiceProviders(Class<T> category, ServiceRegistry.Filter filter, boolean useOrdering) 返回一个Iterator,其中包含满足由提供的ServiceRegistry.Filter对象的filter方法施加的条件的给定类别中的服务提供程序对象。static <T> Iterator<T> lookupProviders(Class<T> providerClass) 使用上下文类加载器查找并逐步实例化给定服务的可用提供程序。static <T> Iterator<T> lookupProviders(Class<T> providerClass, ClassLoader loader) 使用给定的类加载器搜索特定服务类的实现。voidregisterServiceProvider(Object provider) 将一个服务提供程序对象添加到注册表中。<T> booleanregisterServiceProvider(T provider, Class<T> category) 将一个服务提供程序对象添加到注册表中。voidregisterServiceProviders(Iterator<?> providers) 将一组服务提供程序对象(从Iterator中获取)添加到注册表中。<T> booleansetOrdering(Class<T> category, T firstProvider, T secondProvider) 在给定类别中的两个服务提供程序对象之间设置成对顺序。<T> booleanunsetOrdering(Class<T> category, T firstProvider, T secondProvider) 在给定类别中的两个服务提供程序对象之间设置成对顺序。
-
Constructor Details
-
ServiceRegistry
使用从categories参数中获取的一组类别构造ServiceRegistry实例。这些类别必须都是类规范中列出的服务类型的成员。- 参数:
-
categories- 包含用于定义类别的Class对象的Iterator。 - 抛出:
-
IllegalArgumentException- 如果categories为null,或者如果其中一个类别不是允许的服务类型。
-
-
Method Details
-
lookupProviders
使用给定的类加载器搜索特定服务类的实现。服务类必须是类规范中列出的服务类型之一。如果不是,则将抛出
IllegalArgumentException。此方法将给定服务类的名称转换为提供程序配置文件名,如类注释中所述,然后使用给定类加载器的
getResources方法查找所有具有该名称的可用文件。然后读取和解析这些文件以生成提供程序类名称列表。返回的迭代器使用给定的类加载器查找并实例化列表的每个元素。由于可能会将扩展安装到正在运行的Java虚拟机中,因此每次调用此方法时可能会返回不同的结果。
- 类型参数:
-
T- providerClass的类型。 - 参数:
-
providerClass- 指示要检测的服务提供程序的类或接口的Class对象。 -
loader- 用于加载提供程序配置文件和实例化提供程序类的类加载器,如果要使用系统类加载器(或者失败则使用引导类加载器),则为null。 - 返回:
-
一个
Iterator,以某种任意顺序产生给定服务的提供程序对象。如果提供程序配置文件违反指定格式或无法找到和实例化提供程序类,则迭代器将抛出Error。 - 抛出:
-
IllegalArgumentException- 如果providerClass为null,或者如果它不是允许的服务类型之一。
-
lookupProviders
使用上下文类加载器查找并逐步实例化给定服务的可用提供程序。此便捷方法等效于:ClassLoader cl = Thread.currentThread().getContextClassLoader(); return Service.providers(service, cl);
服务类必须是类规范中列出的服务类型之一。如果不是,则将抛出
IllegalArgumentException。- 类型参数:
-
T- providerClass的类型。 - 参数:
-
providerClass- 指示要检测的服务提供程序的类或接口的Class对象。 - 返回:
-
一个
Iterator,以某种任意顺序产生给定服务的提供程序对象。如果提供程序配置文件违反指定格式或无法找到和实例化提供程序类,则迭代器将抛出Error。 - 抛出:
-
IllegalArgumentException- 如果providerClass为null,或者如果它不是允许的服务类型之一。
-
getCategories
返回一个Iterator,指示当前类别集合的Class对象。如果没有类别存在,则迭代器将为空。- 返回:
-
一个包含
Class对象的Iterator。
-
registerServiceProvider
将一个服务提供程序对象添加到注册表中。该提供程序与给定类别关联。如果
provider实现了RegisterableService接口,则将调用其onRegistration方法。每次从类别中取消注册它时,例如如果删除类别或注册表被垃圾回收,都将调用其onDeregistration方法。- 类型参数:
-
T- provider的类型。 - 参数:
-
provider- 要注册的服务提供程序对象。 -
category- 要在其中注册提供程序的类别。 - 返回:
-
如果以前在相同类别中未注册相同类的提供程序,则返回
true。 - 抛出:
-
IllegalArgumentException- 如果provider为null。 -
IllegalArgumentException- 如果没有与category对应的类别。 -
ClassCastException- 如果提供程序未实现由category定义的Class。
-
registerServiceProvider
向注册表中添加一个服务提供者对象。该提供者将与注册表中每个其实现的Class相关联的类别一起注册。如果
provider实现了RegisterableService接口,则每个注册的类别下都会调用其onRegistration方法。每次从类别中注销或注册表被终结时,都会调用其onDeregistration方法。- 参数:
-
provider- 要注册的服务提供者对象。 - 抛出:
-
IllegalArgumentException- 如果provider为null。
-
registerServiceProviders
向注册表中添加一组服务提供者对象,从Iterator中获取。每个提供者将与注册表中每个其实现的Class相关联的类别一起注册。对于
providers的每个条目,如果实现了RegisterableService接口,则每个注册的类别下都会调用其onRegistration方法。每次从类别中注销或注册表被终结时,都会调用其onDeregistration方法。- 参数:
-
providers- 包含要注册的服务提供者对象的迭代器。 - 抛出:
-
IllegalArgumentException- 如果providers为null或包含null条目。
-
deregisterServiceProvider
从给定类别中移除一个服务提供者对象。如果提供者以前未注册,则不会发生任何操作,并返回false。否则,返回true。如果与provider相同类的对象但不等于(使用==)provider被注册,则不会注销。如果
provider实现了RegisterableService接口,则将调用其onDeregistration方法。- 类型参数:
-
T- 提供者的类型。 - 参数:
-
provider- 要注销的服务提供者对象。 -
category- 要从中注销提供者的类别。 - 返回:
-
如果提供者以前在相同类别中注册,则返回
true,否则返回false。 - 抛出:
-
IllegalArgumentException- 如果provider为null。 -
IllegalArgumentException- 如果没有与category对应的类别。 -
ClassCastException- 如果提供者未实现由category定义的类。
-
deregisterServiceProvider
从包含它的所有类别中移除一个服务提供者对象。- 参数:
-
provider- 要注销的服务提供者对象。 - 抛出:
-
IllegalArgumentException- 如果provider为null。
-
contains
返回true如果provider当前已注册。- 参数:
-
provider- 要查询的服务提供者对象。 - 返回:
-
如果给定的提供者已注册,则返回
true。 - 抛出:
-
IllegalArgumentException- 如果provider为null。
-
getServiceProviders
返回一个包含给定类别中所有已注册服务提供者的Iterator。如果useOrdering为false,则迭代器将以任意顺序返回所有服务器提供者对象。否则,顺序将遵守已设置的任何成对顺序。如果成对顺序图包含循环,则不会返回属于循环的任何提供者。- 类型参数:
-
T- 类别的类型。 - 参数:
-
category- 要检索的类别。 -
useOrdering- 如果应考虑成对顺序以对返回的对象进行排序,则为true。 - 返回:
-
包含给定类别中服务提供者对象的
Iterator,可能有序。 - 抛出:
-
IllegalArgumentException- 如果没有与category对应的类别。
-
getServiceProviders
public <T> Iterator<T> getServiceProviders(Class<T> category, ServiceRegistry.Filter filter, boolean useOrdering) 返回一个包含给定类别中满足由提供的ServiceRegistry.Filter对象的filter方法施加的条件的服务提供者对象的Iterator。useOrdering参数控制结果的排序,使用与getServiceProviders(Class, boolean)相同的规则。- 类型参数:
-
T- 类别的类型。 - 参数:
-
category- 要检索的类别。 -
filter-一个ServiceRegistry.Filter实例,其filter方法将被调用。 -
useOrdering- 如果应考虑成对顺序以对返回的对象进行排序,则为true。 - 返回:
-
包含给定类别中服务提供者对象的
Iterator,可能有序。 - 抛出:
-
IllegalArgumentException- 如果没有与category对应的类别。
-
getServiceProviderByClass
返回当前注册的具有给定类类型的服务提供者对象。在任何给定时间只允许注册一个给定类的对象。如果没有注册对象具有所需的类类型,则返回null。- 类型参数:
-
T- 提供者的类型。 - 参数:
-
providerClass- 所需服务提供者对象的Class。 - 返回:
-
具有所需
Class类型的当前注册的服务提供者对象,如果不存在则返回null。 - 抛出:
-
IllegalArgumentException- 如果providerClass为null。
-
setOrdering
在给定类别中的两个服务提供者对象之间设置成对顺序。如果一个或两个对象当前未在给定类别中注册,或者所需的顺序已设置,则不会发生任何操作,并返回false。如果以前按相反方向对提供者进行排序,则将删除该排序。当
useOrdering参数为true时,getServiceProviders方法将使用该顺序。- 类型参数:
-
T- 类别的类型。 - 参数:
-
category- 指示要建立偏好的类别的Class对象。 -
firstProvider- 首选提供者。 -
secondProvider- 要将firstProvider优先的提供者。 - 返回:
-
如果建立了先前未设置的顺序,则返回
true。 - 抛出:
-
IllegalArgumentException- 如果任一提供者为null或它们是相同对象。 -
IllegalArgumentException- 如果没有与category对应的类别。
-
unsetOrdering
在给定类别中的两个服务提供者对象之间设置成对顺序。如果一个或两个对象当前未在给定类别中注册,或者当前未在它们之间设置任何顺序,则不会发生任何操作,并返回false。当
useOrdering参数为true时,getServiceProviders方法将使用该顺序。- 类型参数:
-
T- 类别的类型。 - 参数:
-
category- 指示要取消建立偏好的类别的Class对象。 -
firstProvider- 以前首选的提供者。 -
secondProvider- 要将firstProvider以前优先的提供者。 - 返回:
-
如果先前设置的顺序已取消,则返回
true。 - 抛出:
-
IllegalArgumentException- 如果任一提供者为null或它们是相同对象。 -
IllegalArgumentException- 如果没有与category对应的类别。
-
deregisterAll
从当前在给定类别下注册的所有服务提供者对象中注销。- 参数:
-
category- 要清空的类别。 - 抛出:
-
IllegalArgumentException- 如果没有与category对应的类别。
-
deregisterAll
public void deregisterAll()从所有类别中注销当前注册的所有服务提供者。 -
finalize
Deprecated, for removal: This API element is subject to removal in a future version.Finalization has been deprecated for removal. SeeObject.finalize()for background information and details about migration options.在垃圾回收之前完成此对象。将调用deregisterAll方法以注销当前注册的所有服务提供者。不应从应用程序代码中调用此方法。
-