Class ServiceRegistry
Service providers are looked up from the classpath, under the path
META-INF/services/<full-class-name>.
For example:
META-INF/services/com.company.package.spi.MyService.
The file should contain a list of fully-qualified concrete class names, one per line.
The full-class-name represents an interface or (typically) an abstract class, and is the same class used as the category for this registry. Note that only one instance of a concrete subclass may be registered with a specific category at a time.
Implementation detail: This class is a clean room implementation of
a service registry and does not use the proprietary sun.misc.Service
class that is referred to in the JAR File specification.
This class should work on any Java platform.
- Version:
- $Id: com/twelvemonkeys/util/service/ServiceRegistry.java#2 $
- See Also:
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescription(package private) classKeeps track of each individual category. -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final Map<Class<?>, ServiceRegistry.CategoryRegistry> static final String"META-INF/services/" -
Constructor Summary
ConstructorsConstructorDescriptionServiceRegistry(Iterator<? extends Class<?>> pCategories) Creates aServiceRegistryinstance with a set of categories taken from thepCategoriesargument. -
Method Summary
Modifier and TypeMethodDescriptionReturns anIteratorcontaining all categories in this registry.compatibleCategories(Object pProvider) Returns anIteratorcontaining all categories in this registry the givenpProvidermay be registered with.containingCategories(Object pProvider) Returns anIteratorcontaining all categories in this registry the givenpProvideris currently registered with.booleanderegister(Object pProvider) De-registers the given provider from all categories it's currently registered in.booleanderegister(Object pProvider, Class<?> pCategory) Deregisters the given provider from the given category.private <T> ServiceRegistry.CategoryRegistry<T> getRegistry(Class<T> pCategory) Gets the category registry for the given category.static voidprotected <T> Iterator<T> Returns anIteratorcontaining all providers in the given category.private <T> voidputCategory(Map<Class<?>, ServiceRegistry.CategoryRegistry> pMap, Class<T> pCategory) booleanRegisters the given provider for all categories it matches.<T> booleanRegisters the given provider for the given category.voidRegisters all provider implementations for thisServiceRegistryfound in the application classpath.private <T> booleanregisterImpl(Object pProvider, Class<T> pCategory) (package private) <T> voidregisterSPIs(URL pResource, Class<T> pCategory, ClassLoader pLoader) Registers all SPIs listed in the given resource.
-
Field Details
-
SERVICES
-
categoryMap
-
-
Constructor Details
-
ServiceRegistry
Creates aServiceRegistryinstance with a set of categories taken from thepCategoriesargument.The categories are constant during the lifetime of the registry, and may not be changed after initial creation.
- Parameters:
pCategories- anIteratorcontainingClassobjects that defines this registry's categories.- Throws:
IllegalArgumentException- ifpCategoriesisnull.ClassCastException- ifpCategoriescontains anything butClassobjects.
-
-
Method Details
-
putCategory
private <T> void putCategory(Map<Class<?>, ServiceRegistry.CategoryRegistry> pMap, Class<T> pCategory) -
registerApplicationClasspathSPIs
public void registerApplicationClasspathSPIs()Registers all provider implementations for thisServiceRegistryfound in the application classpath.- Throws:
ServiceConfigurationError- if an error occurred during registration
-
registerSPIs
Registers all SPIs listed in the given resource.- Parameters:
pResource- the resource to load SPIs frompCategory- the category classpLoader- the class loader to use
-
providers
Returns anIteratorcontaining all providers in the given category.The iterator supports removal.
NOTE: Removing a provider from the iterator, deregisters the current provider (as returned by the last invocation of
next()) frompCategory, it does not remove the provider from other categories in the registry.- Parameters:
pCategory- the category class- Returns:
- an
Iteratorcontaining all providers in the given category. - Throws:
IllegalArgumentException- ifpCategoryis not a valid category in this registry
-
categories
-
compatibleCategories
Returns anIteratorcontaining all categories in this registry the givenpProvidermay be registered with.The iterator does not support removal.
- Parameters:
pProvider- the provider instance- Returns:
- an
Iteratorcontaining all categories in this registry the givenpProvidermay be registered with
-
containingCategories
Returns anIteratorcontaining all categories in this registry the givenpProvideris currently registered with.The iterator supports removal.
NOTE: Removing a category from the iterator, de-registers
pProviderfrom the current category (as returned by the last invocation ofnext()), it does not remove the category itself from the registry.- Parameters:
pProvider- the provider instance- Returns:
- an
Iteratorcontaining all categories in this registry the givenpProvidermay be registered with
-
getRegistry
Gets the category registry for the given category.- Parameters:
pCategory- the category class- Returns:
- the
CategoryRegistryfor the given category
-
register
Registers the given provider for all categories it matches.- Parameters:
pProvider- the provider instance- Returns:
trueifpProvideris now registered in one or more categories it was not registered in before.- See Also:
-
registerImpl
-
register
Registers the given provider for the given category.- Parameters:
pProvider- the provider instancepCategory- the category class- Returns:
trueifpProvideris now registered in the given category
-
deregister
De-registers the given provider from all categories it's currently registered in.- Parameters:
pProvider- the provider instance- Returns:
trueifpProviderwas previously registered in any category and is now de-registered.- See Also:
-
deregister
-
main
-