Package com.google.inject.assistedinject
Class FactoryProvider2<F>
- java.lang.Object
-
- com.google.inject.assistedinject.FactoryProvider2<F>
-
- All Implemented Interfaces:
AssistedInjectBinding<F>
,Provider<F>
,HasDependencies
,ProviderWithExtensionVisitor<F>
,java.lang.reflect.InvocationHandler
,javax.inject.Provider<F>
final class FactoryProvider2<F> extends java.lang.Object implements java.lang.reflect.InvocationHandler, ProviderWithExtensionVisitor<F>, HasDependencies, AssistedInjectBinding<F>
The newer implementation of factory provider. This implementation uses a child injector to create values.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static class
FactoryProvider2.AssistData
All the data necessary to perform an assisted inject.private static class
FactoryProvider2.MethodHandleWrapper
Wrapper around MethodHandles/MethodHandle, so we can compile+run on java6.private static class
FactoryProvider2.ThreadLocalProvider
-
Field Summary
Fields Modifier and Type Field Description private com.google.common.collect.ImmutableMap<java.lang.reflect.Method,FactoryProvider2.AssistData>
assistDataByMethod
Mapping from method to the data about how the method will be assisted.private BindingCollector
collector
The binding collector, for equality/hashing purposes.(package private) static Assisted
DEFAULT_ANNOTATION
if a factory method parameter isn't annotated, it gets this annotation.private F
factory
the factory interface, implemented and providedprivate Key<F>
factoryKey
The key that this is bound to.private Injector
injector
the hosting injector, or null if we haven't been initialized yet(package private) static java.util.logging.Logger
logger
private com.google.common.collect.ImmutableMap<java.lang.reflect.Method,FactoryProvider2.MethodHandleWrapper>
methodHandleByMethod
Mapping from method to method handle, for generated default methods.(package private) static java.lang.annotation.Annotation
RETURN_ANNOTATION
A constant annotation to denote the return value, instead of creating a new one each time.
-
Constructor Summary
Constructors Constructor Description FactoryProvider2(Key<F> factoryKey, BindingCollector collector)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description <T,V>
VacceptExtensionVisitor(BindingTargetVisitor<T,V> visitor, ProviderInstanceBinding<? extends T> binding)
Instructs the extension determine if the visitor is an instance of a custom extension visitor, and if so, visit it using that method.private <T> Key<T>
assistKey(java.lang.reflect.Method method, Key<T> key, Errors errors)
Returns a key similar tokey
, but with an @Assisted binding annotation.(package private) static boolean
canRethrow(java.lang.reflect.Method invoked, java.lang.Throwable thrown)
Returns true ifthrown
can be thrown byinvoked
without wrapping.private boolean
constructorHasMatchingParams(TypeLiteral<?> type, java.lang.reflect.Constructor<?> constructor, java.util.List<Key<?>> paramList, Errors errors)
Matching logic for constructors annotated with AssistedInject.boolean
equals(java.lang.Object obj)
private <T> InjectionPoint
findMatchingConstructorInjectionPoint(java.lang.reflect.Method method, Key<?> returnType, TypeLiteral<T> implementation, java.util.List<Key<?>> paramList)
Finds a constructor suitable for the method.F
get()
Provides an instance ofT
.java.util.Collection<AssistedMethod>
getAssistedMethods()
Returns anAssistedMethod
for each method in the factory.Binding<?>
getBindingFromNewInjector(java.lang.reflect.Method method, java.lang.Object[] args, FactoryProvider2.AssistData data)
Creates a child injector that binds the args, and returns the binding for the method's result.java.util.Set<Dependency<?>>
getDependencies()
Returns the known dependencies for this type.private java.util.Set<Dependency<?>>
getDependencies(InjectionPoint ctorPoint, TypeLiteral<?> implementation)
Calculates all dependencies required by the implementation and constructor.Key<F>
getKey()
Returns theKey
for the factory binding.int
hashCode()
(package private) void
initialize(Injector injector)
At injector-creation time, we initialize the invocation handler.java.lang.Object
invoke(java.lang.Object proxy, java.lang.reflect.Method method, java.lang.Object[] args)
When a factory method is invoked, we create a child injector that binds all parameters, then use that to get an instance of the return type.private boolean
isCompatible(java.lang.reflect.Method src, java.lang.reflect.Method dst)
(package private) static boolean
isDefault(java.lang.reflect.Method method)
private boolean
isInjectorOrAssistedProvider(Dependency<?> dependency)
private boolean
isTypeNotSpecified(TypeLiteral<?> typeLiteral, ConfigurationException ce)
Returns true if the ConfigurationException is due to an error of TypeLiteral not being fully specified.private boolean
isValidForOptimizedAssistedInject(java.util.Set<Dependency<?>> dependencies, java.lang.Class<?> implementation, TypeLiteral<?> factoryType)
Returns true if all dependencies are suitable for the optimized version of AssistedInject.private java.util.Set<Dependency<?>>
removeAssistedDeps(java.util.Set<Dependency<?>> deps)
Return all non-assisted dependencies.java.lang.String
toString()
private void
validateFactoryReturnType(Errors errors, java.lang.Class<?> returnType, java.lang.Class<?> factoryType)
-
-
-
Field Detail
-
RETURN_ANNOTATION
static final java.lang.annotation.Annotation RETURN_ANNOTATION
A constant annotation to denote the return value, instead of creating a new one each time.
-
logger
static final java.util.logging.Logger logger
-
DEFAULT_ANNOTATION
static final Assisted DEFAULT_ANNOTATION
if a factory method parameter isn't annotated, it gets this annotation.
-
assistDataByMethod
private final com.google.common.collect.ImmutableMap<java.lang.reflect.Method,FactoryProvider2.AssistData> assistDataByMethod
Mapping from method to the data about how the method will be assisted.
-
methodHandleByMethod
private final com.google.common.collect.ImmutableMap<java.lang.reflect.Method,FactoryProvider2.MethodHandleWrapper> methodHandleByMethod
Mapping from method to method handle, for generated default methods.
-
injector
private Injector injector
the hosting injector, or null if we haven't been initialized yet
-
factory
private final F factory
the factory interface, implemented and provided
-
collector
private final BindingCollector collector
The binding collector, for equality/hashing purposes.
-
-
Constructor Detail
-
FactoryProvider2
FactoryProvider2(Key<F> factoryKey, BindingCollector collector)
- Parameters:
factoryKey
- a key for a Java interface that defines one or more create methods.collector
- binding configuration that maps method return types to implementation types.
-
-
Method Detail
-
isDefault
static boolean isDefault(java.lang.reflect.Method method)
-
isCompatible
private boolean isCompatible(java.lang.reflect.Method src, java.lang.reflect.Method dst)
-
getDependencies
public java.util.Set<Dependency<?>> getDependencies()
Description copied from interface:HasDependencies
Returns the known dependencies for this type. If this has dependencies whose values are not known statically, a dependency for theInjector
will be included in the returned set.- Specified by:
getDependencies
in interfaceHasDependencies
- Returns:
- a possibly empty set
-
getKey
public Key<F> getKey()
Description copied from interface:AssistedInjectBinding
Returns theKey
for the factory binding.- Specified by:
getKey
in interfaceAssistedInjectBinding<F>
-
getAssistedMethods
public java.util.Collection<AssistedMethod> getAssistedMethods()
Description copied from interface:AssistedInjectBinding
Returns anAssistedMethod
for each method in the factory.- Specified by:
getAssistedMethods
in interfaceAssistedInjectBinding<F>
-
acceptExtensionVisitor
public <T,V> V acceptExtensionVisitor(BindingTargetVisitor<T,V> visitor, ProviderInstanceBinding<? extends T> binding)
Description copied from interface:ProviderWithExtensionVisitor
Instructs the extension determine if the visitor is an instance of a custom extension visitor, and if so, visit it using that method. If the visitor is not an instance of the custom extension visitor, this method MUST call visitor.visit(binding).Due to issues with generics, the type parameters of this method do not relate to the type of the provider. In practice, the 'B' type will always be a supertype of 'T'.
- Specified by:
acceptExtensionVisitor
in interfaceProviderWithExtensionVisitor<F>
-
validateFactoryReturnType
private void validateFactoryReturnType(Errors errors, java.lang.Class<?> returnType, java.lang.Class<?> factoryType)
-
isTypeNotSpecified
private boolean isTypeNotSpecified(TypeLiteral<?> typeLiteral, ConfigurationException ce)
Returns true if the ConfigurationException is due to an error of TypeLiteral not being fully specified.
-
findMatchingConstructorInjectionPoint
private <T> InjectionPoint findMatchingConstructorInjectionPoint(java.lang.reflect.Method method, Key<?> returnType, TypeLiteral<T> implementation, java.util.List<Key<?>> paramList) throws ErrorsException
Finds a constructor suitable for the method. If the implementation contained any constructors marked withAssistedInject
, this requires allAssisted
parameters to exactly match the parameters (in any order) listed in the method. Otherwise, if noAssistedInject
constructors exist, this will default to looking for an @Inject
constructor.- Throws:
ErrorsException
-
constructorHasMatchingParams
private boolean constructorHasMatchingParams(TypeLiteral<?> type, java.lang.reflect.Constructor<?> constructor, java.util.List<Key<?>> paramList, Errors errors) throws ErrorsException
Matching logic for constructors annotated with AssistedInject. This returns true if and only if all @Assisted parameters in the constructor exactly match (in any order) all @Assisted parameters the method's parameter.- Throws:
ErrorsException
-
getDependencies
private java.util.Set<Dependency<?>> getDependencies(InjectionPoint ctorPoint, TypeLiteral<?> implementation)
Calculates all dependencies required by the implementation and constructor.
-
removeAssistedDeps
private java.util.Set<Dependency<?>> removeAssistedDeps(java.util.Set<Dependency<?>> deps)
Return all non-assisted dependencies.
-
isValidForOptimizedAssistedInject
private boolean isValidForOptimizedAssistedInject(java.util.Set<Dependency<?>> dependencies, java.lang.Class<?> implementation, TypeLiteral<?> factoryType)
Returns true if all dependencies are suitable for the optimized version of AssistedInject. The optimized version caches the binding & uses a ThreadLocal Provider, so can only be applied if the assisted bindings are immediately provided. This looks for hints that the values may be lazily retrieved, by looking for injections of Injector or a Provider for the assisted values.
-
isInjectorOrAssistedProvider
private boolean isInjectorOrAssistedProvider(Dependency<?> dependency)
-
assistKey
private <T> Key<T> assistKey(java.lang.reflect.Method method, Key<T> key, Errors errors) throws ErrorsException
Returns a key similar tokey
, but with an @Assisted binding annotation. This fails if another binding annotation is clobbered in the process. If the key already has the @Assisted annotation, it is returned as-is to preserve any String value.- Throws:
ErrorsException
-
initialize
@Inject @Toolable void initialize(Injector injector)
At injector-creation time, we initialize the invocation handler. At this time we make sure all factory methods will be able to build the target types.
-
getBindingFromNewInjector
public Binding<?> getBindingFromNewInjector(java.lang.reflect.Method method, java.lang.Object[] args, FactoryProvider2.AssistData data)
Creates a child injector that binds the args, and returns the binding for the method's result.
-
invoke
public java.lang.Object invoke(java.lang.Object proxy, java.lang.reflect.Method method, java.lang.Object[] args) throws java.lang.Throwable
When a factory method is invoked, we create a child injector that binds all parameters, then use that to get an instance of the return type.- Specified by:
invoke
in interfacejava.lang.reflect.InvocationHandler
- Throws:
java.lang.Throwable
-
toString
public java.lang.String toString()
- Overrides:
toString
in classjava.lang.Object
-
hashCode
public int hashCode()
- Overrides:
hashCode
in classjava.lang.Object
-
equals
public boolean equals(java.lang.Object obj)
- Overrides:
equals
in classjava.lang.Object
-
canRethrow
static boolean canRethrow(java.lang.reflect.Method invoked, java.lang.Throwable thrown)
Returns true ifthrown
can be thrown byinvoked
without wrapping.
-
-