Module  java.desktop
软件包  javax.imageio.spi

Class 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

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

      • ServiceRegistry

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

      • lookupProviders

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

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

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

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

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

        public Iterator<Class<?>> getCategories​()
        返回IteratorClass对象的Iterator ,表示当前的类别集。 如果没有类别,迭代器将为空。
        结果
        一个 Iterator包含 Class对象。
      • registerServiceProvider

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

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

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

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

        如果provider实现RegisterableService接口,则其onRegistration方法将被称为在其注册的每个类别一次。 它的onDeregistration方法将在每次从类别注销时或注册表完成时被调用。

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

        public void registerServiceProviders​(Iterator<?> providers)
        将一组服务提供者对象从Iterator到注册表。 每个提供者在其实现的Class的注册表中存在的每个类别内关联。

        对于实现RegisterableService接口的providers每个条目,其onRegistration方法将在其注册的每个类别被调用一次。 它的onDeregistration方法将在每次从类别注销或注册表完成时被调用。

        参数
        providers - 一个包含要注册的服务提供商对象的迭代器。
        异常
        IllegalArgumentException - 如果 providersnull或包含一个 null条目。
      • deregisterServiceProvider

        public <T> boolean deregisterServiceProvider​(T provider,
                                                     Class<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​(Class<T> category,
                                                   boolean useOrdering)
        返回包含给定类别中的所有注册服务提供商的Iterator 如果useOrderingfalse ,则迭代器将以任意顺序返回所有服务器提供程序对象。 否则,订单将尊重已设置的任何成对订单。 如果成对订单的图形包含循环,则不会返回属于循环的任何提供程序。
        参数类型
        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 - 如果 providerClassnull
      • 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方法来注销所有当前注册的服务提供商。 不应该从应用程序代码调用此方法。
        重写:
        finalizeObject
        异常
        Throwable - 如果超类最终化期间发生错误。
        另请参见:
        WeakReferencePhantomReference