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