当各个Listener有相同order的时候是如何确定顺序的?

来源:3-15 理解SpringApplication总结

慕UI2476813

2020-04-28

写回答

1回答

imooc_lvshun

2020-05-18

跟了一下源码,给个思路。

跟源码会发现,通过工厂方式获取的监听加载之后都会调用

AnnotationAwareOrderComparator.sort(instances);

将获取的list传入这个比较器,而AnnotationAwareOrderComparator是单例模式,并且继承了org.springframework.core.OrderComparator类。而这个父类是真正的比较器。有个compare方法,然后调用自身doCompare方法。

private int doCompare(@Nullable Object o1, @Nullable Object o2, @Nullable OrderSourceProvider sourceProvider) {
  boolean p1 = (o1 instanceof PriorityOrdered);
  boolean p2 = (o2 instanceof PriorityOrdered);
  if (p1 && !p2) {
     return -1;
  }
  else if (p2 && !p1) {
     return 1;
  }

  // Direct evaluation instead of Integer.compareTo to avoid unnecessary object creation.
  int i1 = getOrder(o1, sourceProvider);
  int i2 = getOrder(o2, sourceProvider);
  return (i1 < i2) ? -1 : (i1 > i2) ? 1 : 0;
}

会从两个类中取PriorityOrdered,进行比较。

如果都不存在,就取两个类的Ordered的值,进行比较。

0
0

Spring Boot2.0深度实践 核心原理拆解+源码分析

系统化剖析Spring Boot 2.0,掌握技术原理,学习源码阅读技巧

2904 学习 · 213 问题

查看课程