当各个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的值,进行比较。
00
相似问题