Package com.google.inject.internal
Class Indexer
- java.lang.Object
-
- com.google.inject.spi.DefaultBindingTargetVisitor<java.lang.Object,Indexer.IndexedBinding>
-
- com.google.inject.internal.Indexer
-
- All Implemented Interfaces:
BindingScopingVisitor<java.lang.Object>
,BindingTargetVisitor<java.lang.Object,Indexer.IndexedBinding>
class Indexer extends DefaultBindingTargetVisitor<java.lang.Object,Indexer.IndexedBinding> implements BindingScopingVisitor<java.lang.Object>
Visits bindings to return aIndexedBinding
that can be used to emulate the binding deduplication that Guice internally performs.Note: simply using equals/hashCode on the BindingImpls doesn't work because they all have unique annotations. This works around that by reimplementing equality semantics that ignores
Element.uniqueId()
. A better solution might be to introduce the idea of an 'anonymous' binding to guice, that might support this usecase directly.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description (package private) static class
Indexer.BindingType
(package private) static class
Indexer.IndexedBinding
-
Field Summary
Fields Modifier and Type Field Description private static java.lang.Object
EAGER_SINGLETON
(package private) Injector
injector
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description (package private) boolean
isIndexable(Binding<?> binding)
private java.lang.Object
scope(Binding<?> binding)
Indexer.IndexedBinding
visit(ConstructorBinding<? extends java.lang.Object> binding)
Visit a constructor binding.Indexer.IndexedBinding
visit(ConvertedConstantBinding<? extends java.lang.Object> binding)
Visit a binding created from converting a bound instance to a new type.Indexer.IndexedBinding
visit(ExposedBinding<? extends java.lang.Object> binding)
Visit a binding to a key exposed from an enclosed private environment.Indexer.IndexedBinding
visit(InstanceBinding<? extends java.lang.Object> binding)
Visit a instance binding.Indexer.IndexedBinding
visit(LinkedKeyBinding<? extends java.lang.Object> binding)
Visit a linked key binding.Indexer.IndexedBinding
visit(ProviderBinding<? extends java.lang.Object> binding)
Visit a binding to aProvider
that delegates to the binding for the provided type.Indexer.IndexedBinding
visit(ProviderInstanceBinding<? extends java.lang.Object> binding)
Visit a provider instance binding.Indexer.IndexedBinding
visit(ProviderKeyBinding<? extends java.lang.Object> binding)
Visit a provider key binding.Indexer.IndexedBinding
visit(UntargettedBinding<? extends java.lang.Object> binding)
Visit an untargetted binding.java.lang.Object
visitEagerSingleton()
Visit an eager singleton or single instance.java.lang.Object
visitNoScoping()
Visit an unspecified or unscoped strategy.java.lang.Object
visitScope(Scope scope)
Visit a scope instance.java.lang.Object
visitScopeAnnotation(java.lang.Class<? extends java.lang.annotation.Annotation> scopeAnnotation)
Visit a scope annotation.-
Methods inherited from class com.google.inject.spi.DefaultBindingTargetVisitor
visitOther
-
-
-
-
Field Detail
-
injector
final Injector injector
-
EAGER_SINGLETON
private static final java.lang.Object EAGER_SINGLETON
-
-
Constructor Detail
-
Indexer
Indexer(Injector injector)
-
-
Method Detail
-
isIndexable
boolean isIndexable(Binding<?> binding)
-
scope
private java.lang.Object scope(Binding<?> binding)
-
visit
public Indexer.IndexedBinding visit(ConstructorBinding<? extends java.lang.Object> binding)
Description copied from interface:BindingTargetVisitor
Visit a constructor binding. To resolve injections, an instance is instantiated by invokingconstructor
. This target is found only on injector bindings.- Specified by:
visit
in interfaceBindingTargetVisitor<java.lang.Object,Indexer.IndexedBinding>
- Overrides:
visit
in classDefaultBindingTargetVisitor<java.lang.Object,Indexer.IndexedBinding>
-
visit
public Indexer.IndexedBinding visit(ConvertedConstantBinding<? extends java.lang.Object> binding)
Description copied from interface:BindingTargetVisitor
Visit a binding created from converting a bound instance to a new type. The source binding has the same binding annotation but a different type. This target is found only on injector bindings.- Specified by:
visit
in interfaceBindingTargetVisitor<java.lang.Object,Indexer.IndexedBinding>
- Overrides:
visit
in classDefaultBindingTargetVisitor<java.lang.Object,Indexer.IndexedBinding>
-
visit
public Indexer.IndexedBinding visit(ExposedBinding<? extends java.lang.Object> binding)
Description copied from interface:BindingTargetVisitor
Visit a binding to a key exposed from an enclosed private environment. This target is only found in injector bindings.- Specified by:
visit
in interfaceBindingTargetVisitor<java.lang.Object,Indexer.IndexedBinding>
- Overrides:
visit
in classDefaultBindingTargetVisitor<java.lang.Object,Indexer.IndexedBinding>
-
visit
public Indexer.IndexedBinding visit(InstanceBinding<? extends java.lang.Object> binding)
Description copied from interface:BindingTargetVisitor
Visit a instance binding. The same instance is returned for every injection. This target is found in both module and injector bindings.- Specified by:
visit
in interfaceBindingTargetVisitor<java.lang.Object,Indexer.IndexedBinding>
- Overrides:
visit
in classDefaultBindingTargetVisitor<java.lang.Object,Indexer.IndexedBinding>
-
visit
public Indexer.IndexedBinding visit(LinkedKeyBinding<? extends java.lang.Object> binding)
Description copied from interface:BindingTargetVisitor
Visit a linked key binding. The other key's binding is used to resolve injections. This target is found in both module and injector bindings.- Specified by:
visit
in interfaceBindingTargetVisitor<java.lang.Object,Indexer.IndexedBinding>
- Overrides:
visit
in classDefaultBindingTargetVisitor<java.lang.Object,Indexer.IndexedBinding>
-
visit
public Indexer.IndexedBinding visit(ProviderBinding<? extends java.lang.Object> binding)
Description copied from interface:BindingTargetVisitor
Visit a binding to aProvider
that delegates to the binding for the provided type. This target is found only on injector bindings.- Specified by:
visit
in interfaceBindingTargetVisitor<java.lang.Object,Indexer.IndexedBinding>
- Overrides:
visit
in classDefaultBindingTargetVisitor<java.lang.Object,Indexer.IndexedBinding>
-
visit
public Indexer.IndexedBinding visit(ProviderInstanceBinding<? extends java.lang.Object> binding)
Description copied from interface:BindingTargetVisitor
Visit a provider instance binding. The provider'sget
method is invoked to resolve injections. This target is found in both module and injector bindings.- Specified by:
visit
in interfaceBindingTargetVisitor<java.lang.Object,Indexer.IndexedBinding>
- Overrides:
visit
in classDefaultBindingTargetVisitor<java.lang.Object,Indexer.IndexedBinding>
-
visit
public Indexer.IndexedBinding visit(ProviderKeyBinding<? extends java.lang.Object> binding)
Description copied from interface:BindingTargetVisitor
Visit a provider key binding. To resolve injections, the provider key is first resolved, then that provider'sget
method is invoked. This target is found in both module and injector bindings.- Specified by:
visit
in interfaceBindingTargetVisitor<java.lang.Object,Indexer.IndexedBinding>
- Overrides:
visit
in classDefaultBindingTargetVisitor<java.lang.Object,Indexer.IndexedBinding>
-
visit
public Indexer.IndexedBinding visit(UntargettedBinding<? extends java.lang.Object> binding)
Description copied from interface:BindingTargetVisitor
Visit an untargetted binding. This target is found only on module bindings. It indicates that the injector should use its implicit binding strategies to resolve injections.- Specified by:
visit
in interfaceBindingTargetVisitor<java.lang.Object,Indexer.IndexedBinding>
- Overrides:
visit
in classDefaultBindingTargetVisitor<java.lang.Object,Indexer.IndexedBinding>
-
visitEagerSingleton
public java.lang.Object visitEagerSingleton()
Description copied from interface:BindingScopingVisitor
Visit an eager singleton or single instance. This scope strategy is found on both module and injector bindings.- Specified by:
visitEagerSingleton
in interfaceBindingScopingVisitor<java.lang.Object>
-
visitNoScoping
public java.lang.Object visitNoScoping()
Description copied from interface:BindingScopingVisitor
Visit an unspecified or unscoped strategy. On a module, this strategy indicates that the injector should use scoping annotations to find a scope. On an injector, it indicates that no scope is applied to the binding. An unscoped binding will behave like a scoped one when it is linked to a scoped binding.- Specified by:
visitNoScoping
in interfaceBindingScopingVisitor<java.lang.Object>
-
visitScope
public java.lang.Object visitScope(Scope scope)
Description copied from interface:BindingScopingVisitor
Visit a scope instance. This scope strategy is found on both module and injector bindings.- Specified by:
visitScope
in interfaceBindingScopingVisitor<java.lang.Object>
-
visitScopeAnnotation
public java.lang.Object visitScopeAnnotation(java.lang.Class<? extends java.lang.annotation.Annotation> scopeAnnotation)
Description copied from interface:BindingScopingVisitor
Visit a scope annotation. This scope strategy is found only on module bindings. The instance that implements this scope is registered byBinder.bindScope()
.- Specified by:
visitScopeAnnotation
in interfaceBindingScopingVisitor<java.lang.Object>
-
-