public class ServiceRegistry extends Object
サービスとは、既知のインタフェースおよびクラス(通常は抽象クラス)のセットです。サービス・プロバイダとは、特定のサービスの実装です。プロバイダ内のクラスは通常、インタフェースを実装するか、またはサービス自体が定義されたクラスをサブクラス化します。
サービス・プロバイダは1つまたは複数のカテゴリに格納されます。各カテゴリは、そのすべてのメンバーを実装する必要のあるクラス・インタフェース(Class
オブジェクトにより記述されます)で定義されます。カテゴリ・セットは動的に変更できます。
指定されたリーフ・クラス(つまり、任意の継承されたクラスやインタフェースではなく、getClass()
で返された実際のクラス)の1つのインスタンスのみが登録できます。ここで、com.mycompany.mypkg.GreenServiceProvider
クラスがcom.mycompany.mypkg.MyService
インタフェースを実装すると仮定します。GreenServiceProvider
のインスタンスを登録する場合、これはMyService
クラスにより定義されたカテゴリに格納されます。GreenServiceProvider
の新しいインスタンスを登録する場合、これは以前のインスタンスを置き替えます。通常、サービス・プロバイダ・オブジェクトは単体であるため、この動作は適切です。
サービス・プロバイダを宣言するために、services
サブディレクトリが各JARファイルに存在するMETA-INF
ディレクトリ内に配置されます。このディレクトリには、JARファイルに1つまたは複数の実装クラスを保持する各サービス・プロバイダ・インタフェースに対して1つのファイルが含まれます。たとえば、JARファイルにjavax.someapi.SomeService
インタフェースを実装するcom.mycompany.mypkg.MyServiceImpl
というクラスが含まれる場合、JARには次の名前のファイルが含まれます。
META-INF/services/javax.someapi.SomeServiceまた、次の行が含まれます。
com.mycompany.mypkg.MyService
サービス・プロバイダ・クラスは軽量で、迅速にロードする必要があります。これらのインタフェースの実装は、ほかのクラスやネイティブ・コードに複雑に依存しないようにする必要があります。複雑なサービスの場合の通常のパターンは、負荷の高いサービスに対して軽量なプロキシを登録するというものです。
適切な実行時アクセス権があれば、アプリケーションでレジストリの内容を必要に応じてカスタマイズできます。
サービス・プロバイダ宣言の詳細およびJAR形式全般については、「JARファイルの仕様」を参照してください。
RegisterableService
修飾子と型 | クラスと説明 |
---|---|
static interface |
ServiceRegistry.Filter
任意の基準に一致するプロバイダを選択するために
ServiceRegistry.getServiceProviders で使用される単純なフィルタ・インタフェースです。 |
コンストラクタと説明 |
---|
ServiceRegistry(Iterator<Class<?>> categories)
categories 引数から取り出したカテゴリ・セットを使用してServiceRegistry インスタンスを構築します。 |
修飾子と型 | メソッドと説明 |
---|---|
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()
ガベージ・コレクションの前にこのオブジェクトをファイナライズします。
|
Iterator<Class<?>> |
getCategories()
現在のカテゴリ・セットを示す
Class オブジェクトのIterator を返します。 |
<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)
指定された
ServiceRegistry.Filter オブジェクトのfilter メソッドで設定された基準を満たす、指定されたカテゴリ内のサービス・プロバイダ・オブジェクトを含むIterator を返します。 |
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)
指定されたカテゴリの2つのサービス・プロバイダ・オブジェクト間のペアの順序を設定します。
|
<T> boolean |
unsetOrdering(Class<T> category, T firstProvider, T secondProvider)
指定されたカテゴリの2つのサービス・プロバイダ・オブジェクト間のペアの順序を設定します。
|
public ServiceRegistry(Iterator<Class<?>> categories)
categories
引数から取り出したカテゴリ・セットを使用してServiceRegistry
インスタンスを構築します。categories
- カテゴリの定義に使用するClass
オブジェクトを含むIterator
。IllegalArgumentException
- categories
がnull
の場合。public static <T> Iterator<T> lookupProviders(Class<T> providerClass, ClassLoader loader)
このメソッドは、指定されたサービス・クラスの名前を、クラス・コメントの記述に従ってプロバイダ構成のファイル名に変換し、指定されたクラス・ローダーのgetResources
メソッドを使用してその名前を持つ使用可能なファイルすべてを検索します。これらのファイルは次に読み込まれて構文解析され、プロバイダ・クラス名のリストが作成されます。返されたイテレータは指定されたクラス・ローダーを使用して、リストの各要素を参照しインスタンス化します。
実行中のJava仮想マシンに拡張機能をインストールすることが可能であるため、このメソッドは呼び出されるたびに異なる結果を返す場合があります。
T
- providerClassの型。providerClass
- 検出中のサービス・プロバイダのクラスまたはインタフェースを示すClass
オブジェクト。loader
- プロバイダ構成ファイルのロードおよびプロバイダ・クラスのインスタンス化に使用するクラス・ローダー。システム・クラス・ローダーを使用する場合、またはブートストラップ・クラス・ローダーで失敗した場合はnull
。Iterator
。プロバイダ構成のファイルが指定された形式に違反するか、またはプロバイダ・クラスを検出してインスタンス化できない場合、イテレータによりError
がスローされる。IllegalArgumentException
- providerClass
がnull
の場合。public static <T> Iterator<T> lookupProviders(Class<T> providerClass)
ClassLoader cl = Thread.currentThread().getContextClassLoader(); return Service.providers(service, cl);
T
- providerClassの型。providerClass
- 検出中のサービス・プロバイダのクラスまたはインタフェースを示すClass
オブジェクト。Iterator
。プロバイダ構成のファイルが指定された形式に違反するか、またはプロバイダ・クラスを検出してインスタンス化できない場合、イテレータによりError
がスローされる。IllegalArgumentException
- providerClass
がnull
の場合。public Iterator<Class<?>> getCategories()
Class
オブジェクトのIterator
を返します。カテゴリが存在しない場合、イテレータは空です。Class
オブジェクトを含むIterator
。public <T> boolean registerServiceProvider(T provider, Class<T> category)
provider
がRegisterableService
インタフェースを実装する場合は、そのonRegistration
メソッドが呼び出されます。そのonDeregistration
メソッドは、カテゴリの削除やレジストリのガベージ・コレクトなど、カテゴリから登録解除されるたびに呼び出されます。
T
- プロバイダの型。provider
- 登録されるサービス・プロバイダ・オブジェクト。category
- プロバイダが登録されるカテゴリ。IllegalArgumentException
- provider
がnull
の場合。IllegalArgumentException
- category
に対応するカテゴリが存在しない場合。ClassCastException
- プロバイダがcategory
で定義されたClass
を実装しない場合。public void registerServiceProvider(Object provider)
Class
を実装するレジストリに存在する各カテゴリ内で関連付けされます。
provider
がRegisterableService
インタフェースを実装する場合、onRegistration
メソッドが登録されるカテゴリごとに一度呼び出されます。そのonDeregistration
メソッドは、カテゴリから登録解除されるたび、またはレジストリがファイナライズされる際に呼び出されます。
provider
- 登録されるサービス・プロバイダ・オブジェクト。IllegalArgumentException
- provider
がnull
の場合。public void registerServiceProviders(Iterator<?> providers)
Iterator
から取り込んだ一連のサービス・プロバイダ・オブジェクトをレジストリに追加します。各プロバイダは、Class
を実装するレジストリに存在する各カテゴリ内で関連付けされます。
RegisterableService
インタフェースを実装するproviders
の各エントリの場合、onRegistration
メソッドが登録されるカテゴリごとに一度呼び出されます。そのonDeregistration
メソッドは、カテゴリから登録解除されるたび、またはレジストリがファイナライズされる際に呼び出されます。
providers
- 登録されるサービス・プロバイダ・オブジェクトを含むイテレータ。IllegalArgumentException
- providers
がnull
であるか、null
エントリを含む場合。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
で定義されたクラスを実装しない場合。public void deregisterServiceProvider(Object provider)
provider
- 登録解除されるサービス・プロバイダ・オブジェクト。IllegalArgumentException
- provider
がnull
の場合。public boolean contains(Object provider)
provider
が現在登録されている場合、true
を返します。provider
- 照会されるサービス・プロバイダ・オブジェクト。true
。IllegalArgumentException
- provider
がnull
の場合。public <T> Iterator<T> getServiceProviders(Class<T> category, boolean useOrdering)
Iterator
を返します。useOrdering
がfalse
の場合、イテレータはすべてのサービス・プロバイダ・オブジェクトを任意の順序で返します。それ以外の場合、順番は設定されたペアの順序付けすべてを反映します。ペアの順序付けのグラフにサイクルが含まれる場合、サイクルに所属するプロバイダはどれも返されません。T
- カテゴリの型。category
- 取得元のカテゴリ。useOrdering
- 返されるオブジェクトの順番にペアの順序付けを反映する場合はtrue
。Iterator
(大抵はその順序通り)。IllegalArgumentException
- category
に対応するカテゴリが存在しない場合。public <T> Iterator<T> getServiceProviders(Class<T> category, ServiceRegistry.Filter filter, boolean useOrdering)
ServiceRegistry.Filter
オブジェクトのfilter
メソッドで設定された基準を満たす、指定されたカテゴリ内のサービス・プロバイダ・オブジェクトを含むIterator
を返します。
useOrdering
引数により、getServiceProviders(Class, boolean)
と同じルールを使用して結果の順序付けが制御されます。
T
- カテゴリの型。category
- 取得元のカテゴリ。filter
- filter
メソッドが呼び出されるServiceRegistry.Filter
インスタンス。useOrdering
- 返されるオブジェクトの順番にペアの順序付けを反映する場合はtrue
。Iterator
(大抵はその順序通り)。IllegalArgumentException
- category
に対応するカテゴリが存在しない場合。public <T> T getServiceProviderByClass(Class<T> providerClass)
null
を返します。T
- プロバイダの型。providerClass
- 目的とするサービス・プロバイダ・オブジェクトのClass
。Class
型のサービス・プロバイダ・オブジェクト。存在しない場合はnull
。IllegalArgumentException
- providerClass
がnull
の場合。public <T> boolean setOrdering(Class<T> category, T firstProvider, T secondProvider)
false
を返します。プロバイダが以前に逆方向に順序付けされた場合、その順序は削除されます。
この順序は、useOrdering
引数がtrue
の場合にgetServiceProviders
によって使用されます。
T
- カテゴリの型。category
- 優先度を設定するカテゴリを示すClass
オブジェクト。firstProvider
- 優先されるプロバイダ。secondProvider
- firstProvider
が優先されるプロバイダ。true
。IllegalArgumentException
- プロバイダがnull
か、または同じオブジェクトの場合。IllegalArgumentException
- category
に対応するカテゴリが存在しない場合。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
に対応するカテゴリが存在しない場合。public void deregisterAll(Class<?> category)
category
- 空にするカテゴリ。IllegalArgumentException
- category
に対応するカテゴリが存在しない場合。public void deregisterAll()
public void finalize() throws Throwable
deregisterAll
メソッドを呼び出して、現在登録されているサービス・プロバイダをすべて登録解除します。このメソッドを、アプリケーション・コードから呼び出してはいけません。finalize
、クラス: Object
Throwable
- スーパー・クラスのファイナライズ時にエラーが発生した場合。WeakReference
, PhantomReference
バグまたは機能を送信
詳細なAPIリファレンスおよび開発者ドキュメントについては、Java SEのドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright© 1993, 2014, Oracle and/or its affiliates. All rights reserved.