模块  java.desktop
软件包  javax.imageio.spi

Class ServiceRegistry

  • 已知直接子类:
    IIORegistry

    public class ServiceRegistry
    extends Object
    用于Image I / O服务类型的服务提供程序实例的注册表。

    服务提供者存储在一个或多个类别中 ,每个类别 所有成员必须实现的类或接口(由对象描述)定义。

    此类支持的类别集仅限于以下标准Image I / O服务类型:

    尝试加载不是上述类型之一的子类型的提供程序将导致IllegalArgumentException

    有关加载服务提供程序的一般机制,请参阅ServiceLoader ,这是此类使用的基础标准机制。

    只能注册给定叶类的单个实例(即getClass()返回的实际类,而不是任何继承的类或接口)。 也就是说,假设com.mycompany.mypkg.GreenImageReaderProvider类的子类javax.imageio.spi.ImageReaderSpi 如果注册了GreenImageReaderProvider实例,则它将存储在ImageReaderSpi类定义的类别中。 如果注册了新的GreenImageReaderProvider实例,它将替换先前的实例。 实际上,服务提供者对象通常是单例,因此这种行为是恰当的。

    服务提供者类应该是轻量级的并且可以快速加载。 这些接口的实现应避免对其他类和本机代码的复杂依赖性。 更复杂服务的通常模式是为重量级服务注册轻量级代理。

    应用程序可以根据需要自定义注册表的内容,只要它具有适当的运行时权限即可。

    有关如何创建和部署服务提供者的信息,请参阅ServiceLoader上的文档

    另请参见:
    RegisterableServiceServiceLoader
    • 构造方法详细信息

      • ServiceRegistry

        public ServiceRegistry​(Iterator<<?>> categories)
        构造一个ServiceRegistry实例,其中包含一组取自categories参数的类别。 类别必须都是类规范中列出的服务类型集的成员。
        参数
        categories - 包含 对象的 Iterator用于定义类别。
        异常
        IllegalArgumentException - 如果 categoriesnull ,或者其中一个类别不是允许的服务类型。
    • 方法详细信息

      • lookupProviders

        public static <T> Iterator<T> lookupProviders​(<T> providerClass,
                                                      ClassLoader loader)
        使用给定的类加载器搜索特定服务类的实现。

        服务类必须是类规范中列出的服务类型之一。 如果不是,则会抛出IllegalArgumentException

        此方法将给定服务类的名称转换为类注释中所述的provider-configuration文件名,然后使用给定类加载器的getResources方法查找具有该名称的所有可用文件。 然后读取并解析这些文件以生成提供者类名称列表。 返回的迭代器使用给定的类加载器进行查找,然后实例化列表的每个元素。

        由于可以将扩展安装到正在运行的Java虚拟机中,因此每次调用此方法时都可能返回不同的结果。

        参数类型
        T - providerClass的类型。
        参数
        providerClass - 对象,指示正在检测的服务提供商的类或接口。
        loader - 用于加载提供程序配置文件和实例化提供程序类的类加载程序,如果要使用系统类加载程序(或者,无法使用引导程序类加载程序),则使用 null
        结果
        一个Iterator ,以某种任意顺序为给定服务生成提供者对象。 如果提供程序配置文件违反指定格式或者无法找到并实例化提供程序类,则迭代器将抛出Error
        异常
        IllegalArgumentException - 如果 providerClassnull ,或者它不是允许的服务类型之一。
      • lookupProviders

        public static <T> Iterator<T> lookupProviders​(<T> providerClass)
        使用上下文类加载器定位并逐步实例化给定服务的可用提供程序。 这种便捷方法相当于:
          ClassLoader cl = Thread.currentThread().getContextClassLoader();
           return Service.providers(service, cl); 

        服务类必须是类规范中列出的服务类型之一。 如果不是,则会抛出IllegalArgumentException

        参数类型
        T - providerClass的类型。
        参数
        providerClass - 一个 对象,指示正在检测的服务提供者的类或接口。
        结果
        一个Iterator ,以某种任意顺序为给定服务生成提供者对象。 如果提供程序配置文件违反指定格式或无法找到并实例化提供程序类,则迭代器将抛出Error
        异常
        IllegalArgumentException - 如果 providerClassnull ,或者它不是允许的服务类型之一。
      • getCategories

        public Iterator<<?>> getCategories()
        返回Iterator对象,指示当前的类别集。 如果不存在类别,则迭代器将为空。
        结果
        一个 Iterator含有 对象。
      • registerServiceProvider

        public <T> boolean registerServiceProvider​(T provider,
                                                   <T> category)
        将服务提供者对象添加到注册表。 提供者与给定类别相关联。

        如果provider实现RegisterableService接口,则将调用其onRegistration方法。 每次从类别中注销时,将调用其onDeregistration方法,例如,如果删除了类别或注册表是垃圾回收。

        参数类型
        T - 提供者的类型。
        参数
        provider - 该服务提供要注册的对象。
        category - 注册提供商的类别。
        结果
        如果之前未在同一类别类别中注册同一类的提供者,则为true。
        异常
        IllegalArgumentException - 如果 providernull
        IllegalArgumentException - 如果没有对应于 category
        ClassCastException - 如果提供商未实施 定义的 category
      • registerServiceProvider

        public void registerServiceProvider​(Object provider)
        将服务提供者对象添加到注册表。 提供程序与其实现的的注册表中的每个类别相关联。

        如果provider实现了RegisterableService接口,则对于其注册的每个类别,将调用其onRegistration方法一次。 每次从类别中注销或注册表最终确定时,将调用其onDeregistration方法。

        参数
        provider - 要注册的服务提供者对象。
        异常
        IllegalArgumentException - 如果 providernull
      • registerServiceProviders

        public void registerServiceProviders​(Iterator<?> providers)
        将一组服务提供程序对象从Iterator到注册表。 每个提供程序都与其所实现的所在的注册表中的每个类别相关联。

        对于实现RegisterableService接口的providers每个条目,其onRegistration方法将针对其注册的每个类别调用一次。 每次从类别中注销或注册表最终确定时,将调用其onDeregistration方法。

        参数
        providers - 包含要注册的服务提供者对象的Iterator。
        异常
        IllegalArgumentException - 如果 providersnull或者包含 null条目。
      • deregisterServiceProvider

        public <T> boolean deregisterServiceProvider​(T provider,
                                                     <T> category)
        从给定类别中删除服务提供者对象。 如果提供程序以前未注册,则不会发生任何操作并返回false 否则,返回true 如果注册了与provider相同但不相等的对象(使用== )到provider ,则不会取消注册。

        如果provider实现了RegisterableService接口,则将调用其onDeregistration方法。

        参数类型
        T - 提供者的类型。
        参数
        provider - 要取消注册的服务提供者对象。
        category - 从中取消注册提供程序的类别。
        结果
        true如果提供商先前已在同一类别类别中注册, false
        异常
        IllegalArgumentException - 如果 providernull
        IllegalArgumentException - 如果没有对应于 category类别。
        ClassCastException - 如果提供程序未实现 category定义的类。
      • deregisterServiceProvider

        public void deregisterServiceProvider​(Object provider)
        从包含它的所有类别中删除服务提供者对象。
        参数
        provider - 要取消注册的服务提供者对象。
        异常
        IllegalArgumentException - 如果 providernull
      • contains

        public boolean contains​(Object provider)
        如果 provider当前已注册,则返回 true
        参数
        provider - 要查询的服务提供者对象。
        结果
        true如果给定的提供者已注册。
        异常
        IllegalArgumentException - 如果 providernull
      • getServiceProviders

        public <T> Iterator<T> getServiceProviders​(<T> category,
                                                   boolean useOrdering)
        返回包含给定类别中所有注册服务提供者的Iterator 如果useOrderingfalse ,则迭代器将以任意顺序返回所有服务器提供程序对象。 否则,排序将遵循已设置的任何成对排序。 如果成对排序图包含循环,则不会返回属于循环的任何提供程序。
        参数类型
        T - 类别的类型。
        参数
        category - 要检索的类别。
        useOrdering - true如果在订购退回的对象时应考虑成对排序。
        结果
        包含来自给定类别的服务提供者对象的 Iterator ,可能是按顺序排列的。
        异常
        IllegalArgumentException - 如果没有对应于 category
      • getServiceProviders

        public <T> Iterator<T> getServiceProviders​(<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​(<T> providerClass)
        返回给定类类型的当前注册的服务提供者对象。 最多允许在任何给定时间注册给定类的一个对象。 如果没有注册的对象具有所需的类类型,则返回null
        参数类型
        T - 提供者的类型。
        参数
        providerClass - 所需服务提供者对象的
        结果
        当前已注册的服务提供商对象具有所需的 类型,或 null是否存在。
        异常
        IllegalArgumentException - 如果 providerClassnull
      • setOrdering

        public <T> boolean setOrdering​(<T> category,
                                       T firstProvider,
                                       T secondProvider)
        设置给定类别中两个服务提供者对象之间的成对排序。 如果一个或两个对象当前未在给定类别中注册,或者已经设置了所需的顺序,则不会发生任何事情并返回false 如果先前的提供商是反向订购的,那么该订单将被删除。

        useOrdering参数为true时, getServiceProviders方法将使用该排序。

        参数类型
        T - 类别的类型。
        参数
        category - 一个 对象,指示要在其下建立首选项的类别。
        firstProvider - 首选提供商。
        secondProvider -提供到 firstProvider是优选的。
        结果
        true如果建立了先前未设置的排序。
        异常
        IllegalArgumentException - 如果任一提供者是 null或它们是同一个对象。
        IllegalArgumentException - 如果没有对应于 category类别。
      • unsetOrdering

        public <T> boolean unsetOrdering​(<T> category,
                                         T firstProvider,
                                         T secondProvider)
        设置给定类别中两个服务提供者对象之间的成对排序。 如果一个或两个对象当前未在给定类别中注册,或者当前未在它们之间设置任何排序,则不会发生任何操作并返回false

        useOrdering参数为true时, getServiceProviders方法将使用该排序。

        参数类型
        T - 类别的类型。
        参数
        category - 一个 对象,指示要取消偏好的类别。
        firstProvider - 以前首选的提供商。
        secondProvider -提供到 firstProvider以前优选的。
        结果
        true如果先前设定的排序被解除。
        异常
        IllegalArgumentException - 如果任一提供者是 null或者它们是同一个对象。
        IllegalArgumentException - 如果没有对应于 category
      • deregisterAll

        public void deregisterAll​(<?> category)
        取消注册当前在给定类别下注册的所有服务提供者对象。
        参数
        category - 要清空的类别。
        异常
        IllegalArgumentException - 如果没有对应于 category类别。
      • deregisterAll

        public void deregisterAll()
        取消注册所有类别的所有当前注册的服务提供商。
      • finalize

        @Deprecated(since="9")
        public void finalize()
                      throws Throwable
        Deprecated.
        The finalize method has been deprecated. Subclasses that override finalize in order to perform cleanup should be modified to use alternative cleanup mechanisms and to remove the overriding finalize method. When overriding the finalize method, its implementation must explicitly ensure that super.finalize() is invoked as described in Object.finalize(). See the specification for Object.finalize() for further information about migration options.
        在垃圾回收之前完成此对象。 调用deregisterAll方法以取消注册所有当前注册的服务提供者。 不应从应用程序代码调用此方法。
        重写:
        finalizeObject
        异常
        Throwable - 如果在超类完成期间发生错误。
        另请参见:
        WeakReference, PhantomReference