public void postProcessMergedBeanDefinition(
     RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {
   if (beanType != null) {
     InjectionMetadata metadata = findAutowiringMetadata(beanName, beanType);
     metadata.checkConfigMembers(beanDefinition);
   }
 }
 /**
  * 'Native' processing method for direct calls with an arbitrary target instance, resolving all of
  * its fields and methods which are annotated with {@code @Autowired}.
  *
  * @param bean the target instance to process
  * @throws BeansException if autowiring failed
  */
 public void processInjection(Object bean) throws BeansException {
   Class<?> clazz = bean.getClass();
   InjectionMetadata metadata = findAutowiringMetadata(clazz.getName(), clazz);
   try {
     metadata.inject(bean, null, null);
   } catch (Throwable ex) {
     throw new BeanCreationException(
         "Injection of autowired dependencies failed for class [" + clazz + "]", ex);
   }
 }
  @Override
  public PropertyValues postProcessPropertyValues(
      PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName)
      throws BeansException {

    InjectionMetadata metadata = findAutowiringMetadata(beanName, bean.getClass());
    try {
      metadata.inject(bean, beanName, pvs);
    } catch (Throwable ex) {
      throw new BeanCreationException(beanName, "Injection of autowired dependencies failed", ex);
    }
    return pvs;
  }
 private InjectionMetadata findAutowiringMetadata(String beanName, Class<?> clazz) {
   // Quick check on the concurrent map first, with minimal locking.
   // Fall back to class name as cache key, for backwards compatibility with custom callers.
   String cacheKey = (StringUtils.hasLength(beanName) ? beanName : clazz.getName());
   InjectionMetadata metadata = this.injectionMetadataCache.get(cacheKey);
   if (InjectionMetadata.needsRefresh(metadata, clazz)) {
     synchronized (this.injectionMetadataCache) {
       metadata = this.injectionMetadataCache.get(cacheKey);
       if (InjectionMetadata.needsRefresh(metadata, clazz)) {
         metadata = buildAutowiringMetadata(clazz);
         this.injectionMetadataCache.put(cacheKey, metadata);
       }
     }
   }
   return metadata;
 }