code: public <T> T reference(Class<T> type, Annotation qualifier, Class<? extends Annotation> injectAnnotation)
              throws ProviderMissingException, ProvideException, CircularDependenciesException {
          Provider<T> provider = findProvider(type, qualifier);
          T instance = provider.get();
          doInject(instance, null, type, qualifier, injectAnnotation);
          provider.retain();
          provider.notifyReferenced(provider, instance);
  
          //Clear visiting records
          visitedFields.clear();
          visitedInjectNodes.clear();
  
          return instance;
      }
docs: Reference an injectable object and retain it. Use
  {@link #dereference(Object, Class, Annotation, Class)} to dereference it when it's not used
  any more.
  
  @param type             the type of the object
  @param qualifier        the qualifier
  @param injectAnnotation the inject annotation
  @return