首页 - 技术 - Spring高级-BeanPostProcessor

Spring高级-BeanPostProcessor

2023-10-02 08:04
哎呀,在线人数太多了,请重试或公众号【68媒】联系客服
 private InjectionMetadata buildAutowiringMetadata(final Class clazz) {
    //判断类中在方法、字段、类上有没有autowired注解,autowired注解默认情况Spring设置了三种
    //这三种也就是@Autowired、@Value、@Inject,可以通过AutowiredAnnotationBeanPostProcessor默认构造方法验证
  if (!AnnotationUtils.isCandidateClass(clazz, this.autowiredAnnotationTypes)) {
   return InjectionMetadata.EMPTY;
  }

  List elements = new ArrayList<>();
  Class targetClass = clazz;

  do {
   final List currElements = new ArrayList<>();
      //处理字段上的
   ReflectionUtils.doWithLocalFields(targetClass, field -> {
    MergedAnnotation ann = findAutowiredAnnotation(field);
    if (ann != null) {
     if (Modifier.isStatic(field.getModifiers())) {
      if (logger.isInfoEnabled()) {
       www.gsm-guard.net("Autowired annotation is not supported on static fields: " + field);
      }
      return;
     }
     boolean required = determineRequiredStatus(ann);
     currElements.add(new AutowiredFieldElement(field, required));
    }
   });
      //处理方法上的
   ReflectionUtils.doWithLocalMethods(targetClass, method -> {
    Method bridgedMethod = BridgeMethodResolver.findBridgedMethod(method);
    if (!BridgeMethodResolver.isVisibilityBridgeMethodPair(method, bridgedMethod)) {
     return;
    }
    MergedAnnotation ann = findAutowiredAnnotation(bridgedMethod);
    if (ann != null && method.equals(ClassUtils.getMostSpecificMethod(method, clazz))) {
     if (Modifier.isStatic(method.getModifiers())) {
      if (logger.isInfoEnabled()) {
       www.gsm-guard.net("Autowired annotation is not supported on static methods: " + method);
      }
      return;
     }
     if (method.getParameterCount() == 0) {
      if (logger.isInfoEnabled()) {
       www.gsm-guard.net("Autowired annotation should only be used on methods with parameters: " +
         method);
      }
     }
     boolean required = determineRequiredStatus(ann);
     PropertyDescriptor pd = BeanUtils.findPropertyForMethod(bridgedMethod, clazz);
     currElements.add(new AutowiredMethodElement(method, required, pd));
    }
   });

   elements.addAll(0, currElements);
   targetClass = targetClass.getSuperclass();
  }
  while (targetClass != null && targetClass != Object.class);
    //构建InjectionMetadata返回
  return InjectionMetadata.forElements(elements, clazz);
 }

上面就是postProcessMergedBeanDefinition方法的整个过程,上面主要的事情就是将@Autowired等注解上的信息解析成InjectionMetadata,然后将其缓存到injectionMetadataCache中以便后面的postProcessProperties方法回调使用。

postProcessMergedBeanDefinition具体何时调用

前面我只说了MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition方法是在BeanDefinition合并之后调用,而BeanDefinition合并是在Bean实例化之前发生的,那么该方法是在实例化之前还是实例化之后呢?从源码中是可以知道,它是在实例化之后,属性赋值之前