- 直接已知的子类:
-
IIORegistry
服务提供程序存储在一个或多个类别中,每个类别由一个类或接口定义(由Class
对象描述),其所有成员必须实现。
此类支持的类别集仅限于以下标准图像I/O服务类型:
尝试加载不是上述类型的子类型的提供程序将导致IllegalArgumentException
。
有关加载服务提供程序的一般机制,请参阅ServiceLoader
,这是此类使用的基础标准机制。
只能注册给定叶类的单个实例(即由getClass()
返回的实际类,而不是任何继承类或接口)。也就是说,假设com.mycompany.mypkg.GreenImageReaderProvider
类是javax.imageio.spi.ImageReaderSpi
的子类。如果注册了GreenImageReaderProvider
实例,它将存储在由ImageReaderSpi
类定义的类别中。如果注册了GreenImageReaderProvider
的新实例,它将替换先前的实例。实际上,服务提供程序对象通常是单例,因此此行为是适当的。
服务提供程序类应该轻量且快速加载。这些接口的实现应避免对其他类和本地代码的复杂依赖。更复杂服务的通常模式是为重型服务注册轻量级代理。
应用程序可以根据需要自定义注册表的内容,只要具有适当的运行时权限即可。
有关如何创建和部署服务提供程序的信息,请参阅ServiceLoader
上的文档
- 参见:
-
Nested Class Summary
Modifier and TypeClassDescriptionstatic interface
ServiceRegistry.getServiceProviders
使用的简单过滤器接口,用于选择符合任意条件的提供程序。 -
Constructor Summary
ConstructorDescriptionServiceRegistry
(Iterator<Class<?>> categories) 使用从categories
参数中获取的一组类别构造ServiceRegistry
实例。 -
Method Summary
Modifier and TypeMethodDescriptionboolean
如果provider
当前已注册,则返回true
。void
从所有类别中取消注册当前已注册的所有服务提供程序。void
deregisterAll
(Class<?> category) 取消注册当前在给定类别下注册的所有服务提供程序对象。void
deregisterServiceProvider
(Object provider) 从包含它的所有类别中删除一个服务提供程序对象。<T> boolean
deregisterServiceProvider
(T provider, Class<T> category) 从给定类别中删除一个服务提供程序对象。void
finalize()
已弃用,将来会移除:此API元素可能在将来的版本中被移除。已弃用终结。返回一个Iterator
,指示当前类别集合的Class
对象。<T> T
getServiceProviderByClass
(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) 使用给定的类加载器搜索特定服务类的实现。void
registerServiceProvider
(Object provider) 将一个服务提供程序对象添加到注册表中。<T> boolean
registerServiceProvider
(T provider, Class<T> category) 将一个服务提供程序对象添加到注册表中。void
registerServiceProviders
(Iterator<?> providers) 将一组服务提供程序对象(从Iterator
中获取)添加到注册表中。<T> boolean
setOrdering
(Class<T> category, T firstProvider, T secondProvider) 在给定类别中的两个服务提供程序对象之间设置成对顺序。<T> boolean
unsetOrdering
(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
方法以注销当前注册的所有服务提供者。不应从应用程序代码中调用此方法。
-