Class ServiceFactoryFactory


  • public final class ServiceFactoryFactory
    extends Object
    This class is not intended for end users.

    Provide factory instances for AppEngine APIs. Each API will have an associated FactoryProvider registered with this class. N.B. Once getFactory(Class) has been called, no further mappings may be registered with this class.

    To construct the runtime mapping, this class first uses java.util.ServiceLoader to find all registered FactoryProvider entities using the ClassLoader of ServiceFactoryFactory. Finally, the explicitly registered providers register(FactoryProvider) are merged in.

    If ServiceLoader locates multiple providers for a given factory interface, the ambiguity can be resolved by using the ServiceProvider.precedence() annotation property (higher precedence wins; the google implementations all have precedence Integer.MIN_VALUE). An exception is raised if the ambiguity cannot be resolved. Note that explicit registration (register(FactoryProvider)) always takes precedence (it does not honor the ServiceProvider.precedence() annotation property).

    • Field Detail

      • USE_THREAD_CONTEXT_CLASSLOADER_PROPERTY

        public static final String USE_THREAD_CONTEXT_CLASSLOADER_PROPERTY
        If this system property is set to "true" the thread context classloader is used (if non-null) when looking up API service implementations. Otherwise the class loader of this class is used.
        See Also:
        Constant Field Values
    • Constructor Detail

      • ServiceFactoryFactory

        public ServiceFactoryFactory()
    • Method Detail

      • getFactory

        public static <T> T getFactory​(Class<T> base)
        Used by AppEngine service factories. Returns an instance of the factory implementing the interface provide by base. Since there must always be a provider registered for a given base, an error will be raised if no appropriate registration is found.
        Type Parameters:
        T - The type of the factory
        Parameters:
        base - The returned factory must extend this class.
        Throws:
        IllegalArgumentException - raised if the client requests a factory that does not have a provider registered for it.
        ServiceConfigurationError - raised if there is a problem creating the factory instance
      • register

        public static <I> void register​(FactoryProvider<I> p)
        Explicitly register a provider. This does not take the precedence (see FactoryProvider.getPrecedence()) of the provider into consideration; subsequent registrations will always override previous ones.
        Parameters:
        p - The provider to register
        Throws:
        IllegalStateException - raised if calls to getFactoryProvider have already been made.