Interface ObjectProvider<T>

Type Parameters:
T - the object type
All Superinterfaces:
Iterable<T>, ObjectFactory<T>

public interface ObjectProvider<T> extends ObjectFactory<T>, Iterable<T>
A variant of ObjectFactory designed specifically for injection points, allowing for programmatic optionality and lenient not-unique handling.

In a BeanFactory environment, every ObjectProvider obtained from the factory will be bound to its BeanFactory for a specific bean type, matching all provider calls against factory-registered bean definitions. Note that all such calls dynamically operate on the underlying factory state, freshly resolving the requested target object on every call.

As of 5.1, this interface extends Iterable and provides Stream support. It can be therefore be used in for loops, provides Iterable.forEach(java.util.function.Consumer<? super T>) iteration and allows for collection-style stream() access.

As of 6.2, this interface declares default implementations for all methods. This makes it easier to implement in a custom fashion, for example, for unit tests. For typical purposes, implement stream() to enable all other methods. Alternatively, you may implement the specific methods that your callers expect, for example, just getObject() or getIfAvailable().

Since:
4.3
Author:
Juergen Hoeller
See Also:
  • Method Summary

    Modifier and Type
    Method
    Description
    default T
    Return an instance (possibly shared or independent) of the object managed by this factory.
    default T
    getIfAvailable(Supplier<T> defaultSupplier)
    Return an instance (possibly shared or independent) of the object managed by this factory.
    default T
    Return an instance (possibly shared or independent) of the object managed by this factory.
    default T
    getIfUnique(Supplier<T> defaultSupplier)
    Return an instance (possibly shared or independent) of the object managed by this factory.
    default T
    Return an instance (possibly shared or independent) of the object managed by this factory.
    default T
    getObject(Object... args)
    Return an instance (possibly shared or independent) of the object managed by this factory.
    default void
    ifAvailable(Consumer<T> dependencyConsumer)
    Consume an instance (possibly shared or independent) of the object managed by this factory, if available.
    default void
    ifUnique(Consumer<T> dependencyConsumer)
    Consume an instance (possibly shared or independent) of the object managed by this factory, if unique.
    default Iterator<T>
    Return an Iterator over all matching object instances, without specific ordering guarantees (but typically in registration order).
    default Stream<T>
    Return a sequential Stream over all matching object instances, pre-ordered according to the factory's common order comparator.
    default Stream<T>
    Return a sequential Stream over all matching object instances, without specific ordering guarantees (but typically in registration order).

    Methods inherited from interface java.lang.Iterable

    forEach, spliterator
  • Method Details

    • getObject

      default T getObject() throws BeansException
      Description copied from interface: ObjectFactory
      Return an instance (possibly shared or independent) of the object managed by this factory.
      Specified by:
      getObject in interface ObjectFactory<T>
      Returns:
      the resulting instance
      Throws:
      BeansException - in case of creation errors
    • getObject

      default T getObject(Object... args) throws BeansException
      Return an instance (possibly shared or independent) of the object managed by this factory.

      Allows for specifying explicit construction arguments, along the lines of BeanFactory.getBean(String, Object...).

      Parameters:
      args - arguments to use when creating a corresponding instance
      Returns:
      an instance of the bean
      Throws:
      BeansException - in case of creation errors
      See Also:
    • getIfAvailable

      @Nullable default T getIfAvailable() throws BeansException
      Return an instance (possibly shared or independent) of the object managed by this factory.
      Returns:
      an instance of the bean, or null if not available
      Throws:
      BeansException - in case of creation errors
      See Also:
    • getIfAvailable

      default T getIfAvailable(Supplier<T> defaultSupplier) throws BeansException
      Return an instance (possibly shared or independent) of the object managed by this factory.
      Parameters:
      defaultSupplier - a callback for supplying a default object if none is present in the factory
      Returns:
      an instance of the bean, or the supplied default object if no such bean is available
      Throws:
      BeansException - in case of creation errors
      Since:
      5.0
      See Also:
    • ifAvailable

      default void ifAvailable(Consumer<T> dependencyConsumer) throws BeansException
      Consume an instance (possibly shared or independent) of the object managed by this factory, if available.
      Parameters:
      dependencyConsumer - a callback for processing the target object if available (not called otherwise)
      Throws:
      BeansException - in case of creation errors
      Since:
      5.0
      See Also:
    • getIfUnique

      @Nullable default T getIfUnique() throws BeansException
      Return an instance (possibly shared or independent) of the object managed by this factory.
      Returns:
      an instance of the bean, or null if not available or not unique (i.e. multiple candidates found with none marked as primary)
      Throws:
      BeansException - in case of creation errors
      See Also:
    • getIfUnique

      default T getIfUnique(Supplier<T> defaultSupplier) throws BeansException
      Return an instance (possibly shared or independent) of the object managed by this factory.
      Parameters:
      defaultSupplier - a callback for supplying a default object if no unique candidate is present in the factory
      Returns:
      an instance of the bean, or the supplied default object if no such bean is available or if it is not unique in the factory (i.e. multiple candidates found with none marked as primary)
      Throws:
      BeansException - in case of creation errors
      Since:
      5.0
      See Also:
    • ifUnique

      default void ifUnique(Consumer<T> dependencyConsumer) throws BeansException
      Consume an instance (possibly shared or independent) of the object managed by this factory, if unique.
      Parameters:
      dependencyConsumer - a callback for processing the target object if unique (not called otherwise)
      Throws:
      BeansException - in case of creation errors
      Since:
      5.0
      See Also:
    • iterator

      default Iterator<T> iterator()
      Return an Iterator over all matching object instances, without specific ordering guarantees (but typically in registration order).
      Specified by:
      iterator in interface Iterable<T>
      Since:
      5.1
      See Also:
    • stream

      default Stream<T> stream()
      Return a sequential Stream over all matching object instances, without specific ordering guarantees (but typically in registration order).
      Since:
      5.1
      See Also:
    • orderedStream

      default Stream<T> orderedStream()
      Return a sequential Stream over all matching object instances, pre-ordered according to the factory's common order comparator.

      In a standard Spring application context, this will be ordered according to Ordered conventions, and in case of annotation-based configuration also considering the Order annotation, analogous to multi-element injection points of list/array type.

      The default method applies an OrderComparator to the stream() method. You may override this to apply an AnnotationAwareOrderComparator if necessary.

      Since:
      5.1
      See Also: