Class SpringFactoriesLoader
- Direct Known Subclasses:
MockSpringFactoriesLoader
SpringFactoriesLoader
loads and instantiates
factories of a given type from "META-INF/spring.factories" files which
may be present in multiple JAR files in the classpath. The spring.factories
file must be in Properties
format, where the key is the fully qualified
name of the interface or abstract class, and the value is a comma-separated list of
implementation class names. For example:
example.MyService=example.MyServiceImpl1,example.MyServiceImpl2where
example.MyService
is the name of the interface, and MyServiceImpl1
and MyServiceImpl2
are two implementations.
Implementation classes must have a single resolvable constructor that will be used to create the instance, either:
- a primary or single constructor
- a single public constructor
- the default constructor
If the resolvable constructor has arguments, a suitable ArgumentResolver
should be provided. To customize how instantiation failures
are handled, consider providing a FailureHandler
.
- Since:
- 3.2
- Author:
- Arjen Poutsma, Juergen Hoeller, Sam Brannen, Andy Wilkinson, Madhura Bhave, Phillip Webb
-
Nested Class Summary
Modifier and TypeClassDescriptionstatic interface
Strategy for resolving constructor arguments based on their type.static interface
Strategy for handling a failure that occurs when instantiating a factory. -
Field Summary
-
Constructor Summary
ModifierConstructorDescriptionprotected
SpringFactoriesLoader
(ClassLoader classLoader, Map<String, List<String>> factories) Create a newSpringFactoriesLoader
instance. -
Method Summary
Modifier and TypeMethodDescriptionstatic SpringFactoriesLoader
Create aSpringFactoriesLoader
instance that will load and instantiate the factory implementations from "META-INF/spring.factories", using the default class loader.static SpringFactoriesLoader
forDefaultResourceLocation
(ClassLoader classLoader) Create aSpringFactoriesLoader
instance that will load and instantiate the factory implementations from "META-INF/spring.factories", using the given class loader.static SpringFactoriesLoader
forResourceLocation
(String resourceLocation) Create aSpringFactoriesLoader
instance that will load and instantiate the factory implementations from the given location, using the default class loader.static SpringFactoriesLoader
forResourceLocation
(String resourceLocation, ClassLoader classLoader) Create aSpringFactoriesLoader
instance that will load and instantiate the factory implementations from the given location, using the given class loader.protected <T> T
instantiateFactory
(String implementationName, Class<T> type, SpringFactoriesLoader.ArgumentResolver argumentResolver, SpringFactoriesLoader.FailureHandler failureHandler) <T> List<T>
Load and instantiate the factory implementations of the given type from "META-INF/spring.factories", using the configured class loader and a default argument resolver that expects a no-arg constructor.<T> List<T>
load
(Class<T> factoryType, SpringFactoriesLoader.ArgumentResolver argumentResolver) Load and instantiate the factory implementations of the given type from "META-INF/spring.factories", using the configured class loader and the given argument resolver.<T> List<T>
load
(Class<T> factoryType, SpringFactoriesLoader.ArgumentResolver argumentResolver, SpringFactoriesLoader.FailureHandler failureHandler) Load and instantiate the factory implementations of the given type from "META-INF/spring.factories", using the configured class loader, the given argument resolver, and custom failure handling provided by the given failure handler.<T> List<T>
load
(Class<T> factoryType, SpringFactoriesLoader.FailureHandler failureHandler) Load and instantiate the factory implementations of the given type from "META-INF/spring.factories", using the configured class loader with custom failure handling provided by the given failure handler.static <T> List<T>
loadFactories
(Class<T> factoryType, ClassLoader classLoader) Load and instantiate the factory implementations of the given type from "META-INF/spring.factories", using the given class loader.loadFactoriesResource
(ClassLoader classLoader, String resourceLocation) loadFactoryNames
(Class<?> factoryType, ClassLoader classLoader) Deprecated.
-
Field Details
-
FACTORIES_RESOURCE_LOCATION
The location to look for factories.Can be present in multiple JAR files.
- See Also:
-
-
Constructor Details
-
SpringFactoriesLoader
protected SpringFactoriesLoader(@Nullable ClassLoader classLoader, Map<String, List<String>> factories) Create a newSpringFactoriesLoader
instance.- Parameters:
classLoader
- the classloader used to instantiate the factoriesfactories
- a map of factory class name to implementation class names- Since:
- 6.0
-
-
Method Details
-
load
Load and instantiate the factory implementations of the given type from "META-INF/spring.factories", using the configured class loader and a default argument resolver that expects a no-arg constructor.The returned factories are sorted through
AnnotationAwareOrderComparator
.If a custom instantiation strategy is required, use
load(...)
with a customArgumentResolver
and/orFailureHandler
.As of Spring Framework 5.3, if duplicate implementation class names are discovered for a given factory type, only one instance of the duplicated implementation type will be instantiated.
- Parameters:
factoryType
- the interface or abstract class representing the factory- Throws:
IllegalArgumentException
- if any factory implementation class cannot be loaded or if an error occurs while instantiating any factory- Since:
- 6.0
-
load
public <T> List<T> load(Class<T> factoryType, @Nullable SpringFactoriesLoader.ArgumentResolver argumentResolver) Load and instantiate the factory implementations of the given type from "META-INF/spring.factories", using the configured class loader and the given argument resolver.The returned factories are sorted through
AnnotationAwareOrderComparator
.As of Spring Framework 5.3, if duplicate implementation class names are discovered for a given factory type, only one instance of the duplicated implementation type will be instantiated.
- Parameters:
factoryType
- the interface or abstract class representing the factoryargumentResolver
- strategy used to resolve constructor arguments by their type- Throws:
IllegalArgumentException
- if any factory implementation class cannot be loaded or if an error occurs while instantiating any factory- Since:
- 6.0
-
load
public <T> List<T> load(Class<T> factoryType, @Nullable SpringFactoriesLoader.FailureHandler failureHandler) Load and instantiate the factory implementations of the given type from "META-INF/spring.factories", using the configured class loader with custom failure handling provided by the given failure handler.The returned factories are sorted through
AnnotationAwareOrderComparator
.As of Spring Framework 5.3, if duplicate implementation class names are discovered for a given factory type, only one instance of the duplicated implementation type will be instantiated.
For any factory implementation class that cannot be loaded or error that occurs while instantiating it, the given failure handler is called.
- Parameters:
factoryType
- the interface or abstract class representing the factoryfailureHandler
- strategy used to handle factory instantiation failures- Since:
- 6.0
-
load
public <T> List<T> load(Class<T> factoryType, @Nullable SpringFactoriesLoader.ArgumentResolver argumentResolver, @Nullable SpringFactoriesLoader.FailureHandler failureHandler) Load and instantiate the factory implementations of the given type from "META-INF/spring.factories", using the configured class loader, the given argument resolver, and custom failure handling provided by the given failure handler.The returned factories are sorted through
AnnotationAwareOrderComparator
.As of Spring Framework 5.3, if duplicate implementation class names are discovered for a given factory type, only one instance of the duplicated implementation type will be instantiated.
For any factory implementation class that cannot be loaded or error that occurs while instantiating it, the given failure handler is called.
- Parameters:
factoryType
- the interface or abstract class representing the factoryargumentResolver
- strategy used to resolve constructor arguments by their typefailureHandler
- strategy used to handle factory instantiation failures- Since:
- 6.0
-
instantiateFactory
@Nullable protected <T> T instantiateFactory(String implementationName, Class<T> type, @Nullable SpringFactoriesLoader.ArgumentResolver argumentResolver, SpringFactoriesLoader.FailureHandler failureHandler) -
loadFactories
Load and instantiate the factory implementations of the given type from "META-INF/spring.factories", using the given class loader.The returned factories are sorted through
AnnotationAwareOrderComparator
.As of Spring Framework 5.3, if duplicate implementation class names are discovered for a given factory type, only one instance of the duplicated implementation type will be instantiated.
For more advanced factory loading with
SpringFactoriesLoader.ArgumentResolver
orSpringFactoriesLoader.FailureHandler
support useforDefaultResourceLocation(ClassLoader)
to obtain aSpringFactoriesLoader
instance.- Parameters:
factoryType
- the interface or abstract class representing the factoryclassLoader
- the ClassLoader to use for loading (can benull
to use the default)- Throws:
IllegalArgumentException
- if any factory implementation class cannot be loaded or if an error occurs while instantiating any factory
-
loadFactoryNames
@Deprecated(since="6.0") public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) Deprecated.as of 6.0 in favor ofload(Class, ArgumentResolver, FailureHandler)
Load the fully qualified class names of factory implementations of the given type from "META-INF/spring.factories", using the given class loader.As of Spring Framework 5.3, if a particular implementation class name is discovered more than once for the given factory type, duplicates will be ignored.
- Parameters:
factoryType
- the interface or abstract class representing the factoryclassLoader
- the ClassLoader to use for loading resources; can benull
to use the default- Throws:
IllegalArgumentException
- if an error occurs while loading factory names- See Also:
-
forDefaultResourceLocation
Create aSpringFactoriesLoader
instance that will load and instantiate the factory implementations from "META-INF/spring.factories", using the default class loader.- Returns:
- a
SpringFactoriesLoader
instance - Since:
- 6.0
- See Also:
-
forDefaultResourceLocation
Create aSpringFactoriesLoader
instance that will load and instantiate the factory implementations from "META-INF/spring.factories", using the given class loader.- Parameters:
classLoader
- the ClassLoader to use for loading resources; can benull
to use the default- Returns:
- a
SpringFactoriesLoader
instance - Since:
- 6.0
- See Also:
-
forResourceLocation
Create aSpringFactoriesLoader
instance that will load and instantiate the factory implementations from the given location, using the default class loader.- Parameters:
resourceLocation
- the resource location to look for factories- Returns:
- a
SpringFactoriesLoader
instance - Since:
- 6.0
- See Also:
-
forResourceLocation
public static SpringFactoriesLoader forResourceLocation(String resourceLocation, @Nullable ClassLoader classLoader) Create aSpringFactoriesLoader
instance that will load and instantiate the factory implementations from the given location, using the given class loader.- Parameters:
resourceLocation
- the resource location to look for factoriesclassLoader
- the ClassLoader to use for loading resources; can benull
to use the default- Returns:
- a
SpringFactoriesLoader
instance - Since:
- 6.0
- See Also:
-
loadFactoriesResource
-
load(Class, ArgumentResolver, FailureHandler)