/**
   * Obtain a resource object for the given name and type through autowiring based on the given
   * factory.
   *
   * @param factory the factory to autowire against
   * @param element the descriptor for the annotated field/method
   * @param requestingBeanName the name of the requesting bean
   * @return the resource object (never {@code null})
   * @throws BeansException if we failed to obtain the target resource
   */
  protected Object autowireResource(
      BeanFactory factory, LookupElement element, String requestingBeanName) throws BeansException {

    Object resource;
    Set<String> autowiredBeanNames;
    String name = element.name;

    if (this.fallbackToDefaultTypeMatch
        && element.isDefaultName
        && factory instanceof AutowireCapableBeanFactory
        && !factory.containsBean(name)) {
      autowiredBeanNames = new LinkedHashSet<String>();
      resource =
          ((AutowireCapableBeanFactory) factory)
              .resolveDependency(
                  element.getDependencyDescriptor(), requestingBeanName, autowiredBeanNames, null);
    } else {
      resource = factory.getBean(name, element.lookupType);
      autowiredBeanNames = Collections.singleton(name);
    }

    if (factory instanceof ConfigurableBeanFactory) {
      ConfigurableBeanFactory beanFactory = (ConfigurableBeanFactory) factory;
      for (String autowiredBeanName : autowiredBeanNames) {
        if (beanFactory.containsBean(autowiredBeanName)) {
          beanFactory.registerDependentBean(autowiredBeanName, requestingBeanName);
        }
      }
    }

    return resource;
  }
 @Override
 protected Object getResourceToInject(Object target, String requestingBeanName) {
   if (StringUtils.hasLength(this.beanName)) {
     if (beanFactory != null && beanFactory.containsBean(this.beanName)) {
       // Local match found for explicitly specified local bean name.
       Object bean = beanFactory.getBean(this.beanName, this.lookupType);
       if (beanFactory instanceof ConfigurableBeanFactory) {
         ((ConfigurableBeanFactory) beanFactory)
             .registerDependentBean(this.beanName, requestingBeanName);
       }
       return bean;
     } else if (this.isDefaultName && !StringUtils.hasLength(this.mappedName)) {
       throw new NoSuchBeanDefinitionException(
           this.beanName,
           "Cannot resolve 'beanName' in local BeanFactory. Consider specifying a general 'name' value instead.");
     }
   }
   // JNDI name lookup - may still go to a local BeanFactory.
   return getResource(this, requestingBeanName);
 }