- java.lang.Object
-
- javax.imageio.spi.ServiceRegistry
-
- 已知直接子类:
-
IIORegistry
public class ServiceRegistry extends Object
服务提供商实例的注册表。一个服务是一组众所周知的接口(通常是抽象的)类。 服务提供商是服务的具体实现。 提供者中的类通常实现接口或者子类化服务本身定义的类。
服务提供商存储在一个或多个类别中 ,每个类别
Class
所有成员必须实现的一类接口(由Class
对象描述)定义。支持的一组类别仅限于以下标准的图像I / O服务类型:
尝试加载不是上述类型的子类型的提供程序将导致
IllegalArgumentException
。 有关加载服务提供商的一般机制,请参阅ServiceLoader
。可以注册一个给定叶类的一个实例(即
getClass()
返回的实际类,而不是任何继承的类或接口)。 也就是说,假设com.mycompany.mypkg.GreenImageReaderProvider
类的子类javax.imageio.spi.ImageReaderSpi
。 如果一个GreenImageReaderProvider
实例被注册,它将被存储在由ImageReaderSpi
类定义的类别中。 如果注册了一个新的GreenImageReaderProvider
实例,它将替换以前的实例。 实际上,服务提供商对象通常是单身,因此这种行为是合适的。要声明服务提供商,
services
目录中的META-INF
目录将放在每个JAR文件中。 此目录包含每个服务提供程序接口的文件,该接口在JAR文件中具有一个或多个实现类。 例如,如果JAR文件包含一个名为com.mycompany.mypkg.GreenImageReaderProvider
的类,它实现了javax.imageio.spi.ImageReaderSpi
接口,则JAR文件将包含一个名为META-INF/services/javax.imageio.spi.ImageReaderSpi
包含行:com.mycompany.mypkg.GreenImageReaderProvider
服务提供商类应该是轻量级的,并且加载速度快。 这些接口的实现应避免对其他类和本地代码的复杂依赖。 更复杂服务的通常模式是为重量级服务注册轻量级代理。
只要具有适当的运行时权限,应用程序就可以自定义注册表的内容。
有关声明服务提供商的更多详细信息以及JAR格式,请参阅JAR File Specification 。
- 另请参见:
-
RegisterableService
,ServiceLoader
-
-
Nested Class Summary
Nested Classes Modifier and Type Class 描述 static interface
ServiceRegistry.Filter
ServiceRegistry.getServiceProviders
使用的简单过滤器接口来选择与任意条件匹配的提供者。
-
构造方法摘要
构造方法 Constructor 描述 ServiceRegistry(Iterator<Class<?>> categories)
构造一个ServiceRegistry
实例,其中包含一组从categories
参数获取的类别。
-
方法摘要
所有方法 静态方法 接口方法 具体的方法 弃用的方法 Modifier and Type 方法 描述 boolean
contains(Object provider)
如果provider
当前注册,则返回true
。void
deregisterAll()
取消注册所有类别的所有当前注册服务提供商。void
deregisterAll(Class<?> category)
取消注册目前在给定类别下注册的所有服务提供商对象。void
deregisterServiceProvider(Object provider)
从包含它的所有类别中删除服务提供商对象。<T> boolean
deregisterServiceProvider(T provider, Class<T> category)
从给定的类别中删除服务提供者对象。void
finalize()
已过时。finalize
方法已被弃用。 为了执行清理,覆盖finalize
子类应被修改为使用替代的清理机制并删除覆盖的finalize
方法。 当覆盖finalize
方法时,其实现必须明确确保按照super.finalize()
中所述调用super.finalize() 。 有关迁移选项的更多信息,请参阅Object.finalize()
的规范。Iterator<Class<?>>
getCategories()
返回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)
在给定类别中的两个服务提供者对象之间设置成对排序。
-
-
-
构造方法详细信息
-
ServiceRegistry
public ServiceRegistry(Iterator<Class<?>> categories)
构造一个ServiceRegistry
实例,并从categories
参数中获取一组类别。 类别必须都是类规范中列出的一组服务类型的成员。- 参数
-
categories
- 一个Iterator
包含Class
对象用于定义类别。 - 异常
-
IllegalArgumentException
- 如果categories
是null
,或者其中一个类别不是允许的服务类型。
-
-
方法详细信息
-
lookupProviders
public static <T> Iterator<T> lookupProviders(Class<T> providerClass, ClassLoader loader)
使用给定的类加载器搜索特定服务类的实现。服务类必须是类规范中列出的服务类型之一。 如果不是,
IllegalArgumentException
将被抛出。此方法将给定服务类的名称转换为类注释中所述的提供者配置文件名,然后使用给定类加载器的
getResources
方法查找具有该名称的所有可用文件。 然后读取并解析这些文件以生成提供者类名称列表。 返回的迭代器使用给定的类加载器来查找列表中的每个元素,然后实例化。因为可以将扩展安装到正在运行的Java虚拟机中,所以每次调用此方法时都可能会返回不同的结果。
- 参数类型
-
T
- providerClass的类型。 - 参数
-
providerClass
- 表示正在检测到的服务提供商的类或接口的Class
对象。 -
loader
- 要用于加载提供程序配置文件并实例化提供程序类的类加载器,如果要使用系统类加载器(或者不启动引导类加载器),null
。 - 结果
-
一个
Iterator
,以某种任意顺序产生给定服务的提供者对象。 如果提供者配置文件违反了指定的格式,或者不能找到和实例化提供程序类,迭代器将抛出一个Error
。 - 异常
-
IllegalArgumentException
- 如果providerClass
是null
,或者如果它不是允许的服务类型之一。
-
lookupProviders
public static <T> Iterator<T> lookupProviders(Class<T> providerClass)
使用上下文类加载器定位并递增实例化给定服务的可用提供程序。 这种方便方法相当于:ClassLoader cl = Thread.currentThread().getContextClassLoader(); return Service.providers(service, cl);
服务类必须是类规范中列出的服务类型之一。 如果不是,
IllegalArgumentException
将被抛出。- 参数类型
-
T
- providerClass的类型。 - 参数
-
providerClass
- 一个Class
对象,指示正在检测到的服务提供商的类或接口。 - 结果
-
一个
Iterator
,以某种任意顺序产生给定服务的提供程序对象。 如果提供者配置文件违反指定的格式,或者提供者类不能被发现和实例化,迭代器将抛出一个Error
。 - 异常
-
IllegalArgumentException
- 如果providerClass
是null
,或者它不是允许的服务类型之一。
-
getCategories
public Iterator<Class<?>> getCategories()
返回Iterator
个Class
对象的Iterator
,表示当前的类别集。 如果没有类别,迭代器将为空。- 结果
-
一个
Iterator
包含Class
对象。
-
registerServiceProvider
public <T> boolean registerServiceProvider(T provider, Class<T> category)
将服务提供者对象添加到注册表。 提供者与给定类别相关联。如果
provider
实现了RegisterableService
接口,则其onRegistration
方法将被调用。 每次从类别中注销时,将会调用其onDeregistration
方法,例如,如果某个类别被删除或注册表被垃圾回收。- 参数类型
-
T
- 提供者的类型。 - 参数
-
provider
- 服务提供要注册的对象。 -
category
- 注册提供商的类别。 - 结果
- 如果没有同一类的提供者以前在同一类别类别中注册,则为true。
- 异常
-
IllegalArgumentException
- 如果provider
是null
。 -
IllegalArgumentException
- 如果没有类别对应category
。 -
ClassCastException
- 如果提供程序未实现由Class
定义的category
。
-
registerServiceProvider
public void registerServiceProvider(Object provider)
将服务提供者对象添加到注册表。 该提供程序在其实现的Class
的注册表中存在的每个类别中相关联。如果
provider
实现RegisterableService
接口,则其onRegistration
方法将被称为在其注册的每个类别一次。 它的onDeregistration
方法将在每次从类别注销时或注册表完成时被调用。- 参数
-
provider
- 要注册的服务提供商对象。 - 异常
-
IllegalArgumentException
- 如果provider
是null
。
-
registerServiceProviders
public void registerServiceProviders(Iterator<?> providers)
将一组服务提供者对象从Iterator
到注册表。 每个提供者在其实现的Class
的注册表中存在的每个类别内关联。对于实现
RegisterableService
接口的providers
每个条目,其onRegistration
方法将在其注册的每个类别被调用一次。 它的onDeregistration
方法将在每次从类别注销或注册表完成时被调用。- 参数
-
providers
- 一个包含要注册的服务提供商对象的迭代器。 - 异常
-
IllegalArgumentException
- 如果providers
是null
或包含一个null
条目。
-
deregisterServiceProvider
public <T> boolean deregisterServiceProvider(T provider, Class<T> category)
从给定的类别中删除服务提供者对象。 如果提供商以前没有注册,则不会发生任何事情,并返回false
。 否则返回true
。 如果与provider
相同但不相等(使用==
)至provider
对象注册,则不会被注销。如果
provider
实现RegisterableService
接口,则其onDeregistration
方法将被调用。- 参数类型
-
T
- 提供者的类型。 - 参数
-
provider
- 要注销的服务提供商对象。 -
category
- 从中注销提供程序的类别。 - 结果
-
true
如果提供商以前在同一类别类别中注册,false
。 - 异常
-
IllegalArgumentException
- 如果provider
是null
。 -
IllegalArgumentException
- 如果没有类别对应category
。 -
ClassCastException
- 如果提供程序不实现由category
定义的类。
-
deregisterServiceProvider
public void deregisterServiceProvider(Object provider)
从包含它的所有类别中删除服务提供商对象。- 参数
-
provider
- 要注销的服务提供商对象。 - 异常
-
IllegalArgumentException
- 如果provider
是null
。
-
contains
public boolean contains(Object provider)
如果provider
当前注册,则返回true
。- 参数
-
provider
- 要查询的服务提供商对象。 - 结果
-
true
如果给定的提供者已被注册。 - 异常
-
IllegalArgumentException
- 如果provider
是null
。
-
getServiceProviders
public <T> Iterator<T> getServiceProviders(Class<T> category, boolean useOrdering)
返回包含给定类别中的所有注册服务提供商的Iterator
。 如果useOrdering
为false
,则迭代器将以任意顺序返回所有服务器提供程序对象。 否则,订单将尊重已设置的任何成对订单。 如果成对订单的图形包含循环,则不会返回属于循环的任何提供程序。- 参数类型
-
T
- 类别的类型。 - 参数
-
category
- 要从中检索的类别。 -
useOrdering
-true
如果在订购返回的对象时应考虑成对订单。 - 结果
-
一个包含给定类别的服务提供者对象的
Iterator
,可能按顺序排列。 - 异常
-
IllegalArgumentException
- 如果没有类别对应category
。
-
getServiceProviders
public <T> Iterator<T> getServiceProviders(Class<T> category, ServiceRegistry.Filter filter, boolean useOrdering)
返回Iterator
一个给定类别中满足由所提供的定义的条件的含服务提供程序对象ServiceRegistry.Filter
对象的filter
方法。useOrdering
参数使用与getServiceProviders(Class, boolean)
相同的规则来控制结果的排序。- 参数类型
-
T
- 类别的类型。 - 参数
-
category
- 要检索的类别。 -
filter
- 将调用其filter
方法的ServiceRegistry.Filter
的实例。 -
useOrdering
-true
如果在订购返回的对象时应考虑成对订购。 - 结果
-
一个包含给定类别的服务提供者对象的
Iterator
,可能是有序的。 - 异常
-
IllegalArgumentException
- 如果没有类别对应category
。
-
getServiceProviderByClass
public <T> T getServiceProviderByClass(Class<T> providerClass)
返回给定类类型的当前注册的服务提供者对象。 给定类别的最多一个对象允许在任何给定时间被注册。 如果没有注册对象具有所需的类类型,则返回null
。- 参数类型
-
T
- 提供者的类型。 - 参数
-
providerClass
- 所需服务提供商对象的Class
。 - 结果
-
目前注册的服务提供商对象具有所需的
Class
类型,或者是null
是不存在的。 - 异常
-
IllegalArgumentException
- 如果providerClass
是null
。
-
setOrdering
public <T> boolean setOrdering(Class<T> category, T firstProvider, T secondProvider)
在给定类别中的两个服务提供者对象之间设置成对排序。 如果一个或两个对象当前没有在给定类别中注册,或者如果所需的排序已经设置,则不会发生任何事情,并返回false
。 如果提供商之前已经按相反的方向进行订购,那么该订单将被删除。getServiceProviders
方法的useOrdering
参数为true
时,排序将被使用。- 参数类型
-
T
- 类别的类型。 - 参数
-
category
- 一个Class
对象,指示要建立偏好的类别。 -
firstProvider
- 首选提供商。 -
secondProvider
-提供到firstProvider
是优选的。 - 结果
-
true
如果先前未设置的顺序建立。 - 异常
-
IllegalArgumentException
- 如果任一提供者是null
或它们是相同的对象。 -
IllegalArgumentException
- 如果没有类别对应category
。
-
unsetOrdering
public <T> boolean unsetOrdering(Class<T> category, T firstProvider, T secondProvider)
在给定类别中的两个服务提供者对象之间设置成对排序。 如果一个或两个对象当前没有在给定类别中注册,或者如果当前没有设置任何顺序,则不会发生任何事情,并返回false
。当它们的
useOrdering
参数为true
时,排序将由getServiceProviders
方法使用。- 参数类型
-
T
- 类别的类型。 - 参数
-
category
- 一个Class
对象,指示优先级要被拆除的类别。 -
firstProvider
- 以前的首选提供商。 -
secondProvider
- 以前优先选择的供应商firstProvider
。 - 结果
-
true
如果以前设置的排序已经解除了。 - 异常
-
IllegalArgumentException
- 如果任一提供者是null
或它们是相同的对象。 -
IllegalArgumentException
- 如果没有类别对应category
。
-
deregisterAll
public void deregisterAll(Class<?> category)
取消注册目前在给定类别下注册的所有服务提供商对象。- 参数
-
category
- 要清空的类别。 - 异常
-
IllegalArgumentException
- 如果没有类别对应category
。
-
deregisterAll
public void deregisterAll()
取消注册所有类别的所有当前注册服务提供商。
-
finalize
@Deprecated(since="9") public void finalize() throws Throwable
已过时。finalize
方法已被弃用。 为了执行清理,覆盖finalize
子类应被修改为使用替代的清理机制并删除覆盖的finalize
方法。 当覆盖finalize
方法时,其实现必须明确确保按照super.finalize()
中所述调用super.finalize() 。 有关迁移选项的更多信息,请参阅Object.finalize()
的规范。在垃圾收集之前完成此对象。 调用deregisterAll
方法来注销所有当前注册的服务提供商。 不应该从应用程序代码调用此方法。- 重写:
-
finalize
在Object
- 异常
-
Throwable
- 如果超类最终化期间发生错误。 - 另请参见:
-
WeakReference
,PhantomReference
-
-