Spring OrderComparator

  1. private int doCompare(@Nullable Object o1, @Nullable Object o2, @Nullable OrderSourceProvider sourceProvider) {
  2. boolean p1 = (o1 instanceof PriorityOrdered);
  3. boolean p2 = (o2 instanceof PriorityOrdered);
  4. if (p1 && !p2) {
  5. return -1;
  6. } else if (p2 && !p1) {
  7. return 1;
  8. }
  9. int i1 = getOrder(o1, sourceProvider);
  10. int i2 = getOrder(o2, sourceProvider);
  11. // 对比两个Order值得大小返回
  12. return Integer.compare(i1, i2);
  13. }
  1. private int getOrder(@Nullable Object obj, @Nullable OrderSourceProvider sourceProvider) {
  2. Integer order = null;
  3. if (obj != null && sourceProvider != null) {
  4. // 获取Order
  5. Object orderSource = sourceProvider.getOrderSource(obj);
  6. if (orderSource != null) {
  7. if (orderSource.getClass().isArray()) {
  8. // 获取 OrderSourceProvider 的值
  9. Object[] sources = ObjectUtils.toObjectArray(orderSource);
  10. for (Object source : sources) {
  11. // 找 order 返回
  12. order = findOrder(source);
  13. if (order != null) {
  14. break;
  15. }
  16. }
  17. } else {
  18. // 寻找 order
  19. order = findOrder(orderSource);
  20. }
  21. }
  22. }
  23. return (order != null ? order : getOrder(obj));
  24. }
  • 测试用例
  1. @Test
  2. public void compareWithSourceProviderArray() {
  3. Comparator<Object> customComparator = this.comparator.withSourceProvider(
  4. new TestSourceProvider(5L, new Object[]{new StubOrdered(10), new StubOrdered(-25)}));
  5. assertEquals(-1, customComparator.compare(5L, new Object()));
  6. }

image-20200116141838601

  1. @Nullable
  2. protected Integer findOrder(Object obj) {
  3. // 获取Ordered实现类
  4. return (obj instanceof Ordered ? ((Ordered) obj).getOrder() : null);
  5. }
  1. private static final class StubOrdered implements Ordered {
  2. private final int order;
  3. public StubOrdered(int order) {
  4. this.order = order;
  5. }
  6. @Override
  7. public int getOrder() {
  8. return this.order;
  9. }
  10. }

image-20200116141932486

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