源码-Spring中对bean的@Order注解的处理过程

前言

基于Spring-5.2.15.RELEASE版本分析

是使用AnnotationAwareOrderComparator这个比较器类用来给bean排序,在autowired一个数组或者list的时候会对数组或list排序

DefaultListableBeanFactory

private Object resolveMultipleBeans(DependencyDescriptor descriptor, @Nullable String beanName,
      @Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) {

   Class<?> type = descriptor.getDependencyType();

   if (descriptor instanceof StreamDependencyDescriptor) {
      // ...
   }
   else if (type.isArray()) {
      // ...
      
      Object result = converter.convertIfNecessary(matchingBeans.values(), resolvedArrayType);
      if (result instanceof Object[]) {
         // 当我们autowired一个数组的时候,这里给数组排序
         Comparator<Object> comparator = adaptDependencyComparator(matchingBeans);
         if (comparator != null) {
            // 会调用比较器的compare方法
            Arrays.sort((Object[]) result, comparator);
         }
      }
      return result;
   }
   else if (Collection.class.isAssignableFrom(type) && type.isInterface()) {
      // ...
     
      Object result = converter.convertIfNecessary(matchingBeans.values(), type);
      if (result instanceof List) {
         if (((List<?>) result).size() > 1) {
         // 当我们autowired一个List的时候,这里给List排序
            Comparator<Object> comparator = adaptDependencyComparator(matchingBeans);
            if (comparator != null) {
                // 会调用比较器的compare方法
               ((List<?>) result).sort(comparator);
            }
         }
      }
      return result;
   }
   else if (Map.class == type) {
    // ...
   }
   else {
      return null;
   }
}
private Comparator<Object> adaptDependencyComparator(Map<String, ?> matchingBeans) {
   Comparator<Object> comparator = getDependencyComparator();
   if (comparator instanceof OrderComparator) {
      // 返回一个lambod表达式的比较器 
      return ((OrderComparator) comparator).withSourceProvider(
            // 将beanName和bean放入map,然后组合到一个FactoryAwareOrderSourceProvider类中
            createFactoryAwareOrderSourceProvider(matchingBeans));
   }
   else {
      return comparator;
   }
}

OrderComparator

public class OrderComparator implements Comparator<Object> {
    public static final OrderComparator INSTANCE = new OrderComparator();

    public OrderComparator() {
    }
    // 返回一个lambod表达式的比较器
    public Comparator<Object> withSourceProvider(OrderComparator.OrderSourceProvider sourceProvider) {
        // 在list.sort(comparator)时作为参数传入,最终会被调用
        return (o1, o2) -> {
            return this.doCompare(o1, o2, sourceProvider);
        };
    }
}
private int doCompare(@Nullable Object o1, @Nullable Object o2, @Nullable OrderComparator.OrderSourceProvider sourceProvider) {
    boolean p1 = o1 instanceof PriorityOrdered;
    boolean p2 = o2 instanceof PriorityOrdered;
    if (p1 && !p2) {
        return -1;
    } else if (p2 && !p1) {
        return 1;
    } else {
        int i1 = this.getOrder(o1, sourceProvider);
        int i2 = this.getOrder(o2, sourceProvider);
        return Integer.compare(i1, i2);
    }
}
private int getOrder(@Nullable Object obj, @Nullable OrderComparator.OrderSourceProvider sourceProvider) {
    Integer order = null;
    if (obj != null && sourceProvider != null) {
        // 这里返回的是bean么?TODO
        Object orderSource = sourceProvider.getOrderSource(obj);
        if (orderSource != null) {
            if (orderSource.getClass().isArray()) {
                Object[] var5 = ObjectUtils.toObjectArray(orderSource);
                int var6 = var5.length;

                for(int var7 = 0; var7 < var6; ++var7) {
                    Object source = var5[var7];
                    order = this.findOrder(source);
                    if (order != null) {
                        break;
                    }
                }
            } else {
                order = this.findOrder(orderSource);
            }
        }
    }

    return order != null ? order : this.getOrder(obj);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值