code: public synchronized T get(Scope scope) {
      if (instance != null) {
        return instance;
      }
  
      if (providerInstance != null) {
        if (isProvidingSingletonInScope) {
          instance = providerInstance.get();
          //gc
          providerInstance = null;
          return instance;
        }
  
        return providerInstance.get();
      }
  
      if (factoryClass != null && factory == null) {
        factory = FactoryLocator.getFactory(factoryClass);
        //gc
        factoryClass = null;
      }
  
      if (factory != null) {
        if (!factory.hasScopeAnnotation() && !isCreatingSingletonInScope) {
          return factory.createInstance(scope);
        }
        instance = factory.createInstance(scope);
        //gc
        factory = null;
        return instance;
      }
  
      if (providerFactoryClass != null && providerFactory == null) {
        providerFactory = FactoryLocator.getFactory(providerFactoryClass);
        //gc
        providerFactoryClass = null;
      }
  
      if (providerFactory != null) {
        if (providerFactory.hasProvidesSingletonInScopeAnnotation() || isProvidingSingletonInScope) {
          instance = providerFactory.createInstance(scope).get();
          //gc
          providerFactory = null;
          return instance;
        }
        if (providerFactory.hasScopeAnnotation() || isCreatingSingletonInScope) {
          providerInstance = providerFactory.createInstance(scope);
          //gc
          providerFactory = null;
          return providerInstance.get();
        }
  
        return providerFactory.createInstance(scope).get();
      }
  
      throw new IllegalStateException("A provider can only be used with an instance, a provider, a factory or a provider factory. Should not happen.");
    }
docs: of the unbound provider (