Spring OrderComparator
- Author: HuiFer
- 源码阅读仓库: SourceHot-Spring
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;}int i1 = getOrder(o1, sourceProvider);int i2 = getOrder(o2, sourceProvider);// 对比两个Order值得大小返回return Integer.compare(i1, i2);}
private int getOrder(@Nullable Object obj, @Nullable OrderSourceProvider sourceProvider) {Integer order = null;if (obj != null && sourceProvider != null) {// 获取OrderObject orderSource = sourceProvider.getOrderSource(obj);if (orderSource != null) {if (orderSource.getClass().isArray()) {// 获取 OrderSourceProvider 的值Object[] sources = ObjectUtils.toObjectArray(orderSource);for (Object source : sources) {// 找 order 返回order = findOrder(source);if (order != null) {break;}}} else {// 寻找 orderorder = findOrder(orderSource);}}}return (order != null ? order : getOrder(obj));}
- 测试用例
@Testpublic void compareWithSourceProviderArray() {Comparator<Object> customComparator = this.comparator.withSourceProvider(new TestSourceProvider(5L, new Object[]{new StubOrdered(10), new StubOrdered(-25)}));assertEquals(-1, customComparator.compare(5L, new Object()));}

@Nullableprotected Integer findOrder(Object obj) {// 获取Ordered实现类return (obj instanceof Ordered ? ((Ordered) obj).getOrder() : null);}
private static final class StubOrdered implements Ordered {private final int order;public StubOrdered(int order) {this.order = order;}@Overridepublic int getOrder() {return this.order;}}

最终Integer.compare(i1, i2)比较返回 OK !
