The injector's process of resolving an injection request depends on the bindings that have been made and the annotations found on the types involved. Here is a summary of how an injection request is resolved:
1. Observe the Java type and the optional "binding annotation" of the element to be injected. If the type is com.google.inject.Provider
2. Follow transitive bindings. If this binding links to another binding, follow this edge and check again, repeating until we reach a binding which does not link to any other binding. We are now at the most specific explicit binding for this injection request.
3. If this binding specifies an instance or a Provider instance, we're done; use this to fulfill the request.
4. If, at this point, the injection request used an annotation type or value, we have failed and we produce an error.
5. Otherwise examine the Java type for this binding; if an @ImplementedBy annotation is found, instantiate the referenced type. If a @ProvidedBy annotation is found, instantiate the referenced provider and use it to obtain the desired object. Otherwise attempt to instantiate the type itself.