zuul如果两个filter的order一样,是如何排序的?(下)

简介: zuul如果两个filter的order一样,是如何排序的?(下)

正文


如果filterOrder一样如何排序?


我们看看Integercompare方法具体的逻辑

4.png

如果x==y,则返回0,x

5.png

看到这里,我们得出这样的结论,如果filterOrder一样,则Collections.sort(list);排序时不交换位置,这按照ZuulFilter默认加载顺序。那么,ZuulFilter的默认加载顺序是怎么样的?

7.png

它是通过getAllFilters方法获取ZuulFilter集合,该方法其实返回的是名称为filtersConcurrentHashMapvalues,即返回Set集合,是无序的。


  • 重要的事情说三遍:如果filterOrder一样,ZuulFilter是无序的。
  • 重要的事情说三遍:如果filterOrder一样,ZuulFilter是无序的。
  • 重要的事情说三遍:如果filterOrder一样,ZuulFilter是无序的。

所以,filterOrder切记不要定义相同的,不然可能会出现无法预知的执行结果。


两种排序方法


自定义排序其实有两种方法:

  • 实现Comparable接口,重写compareTo方法,
  • 实现Comparator接口,重写compare方法如果要使用Collections.sort(list);排序,它默认用的是第一种方法,上面的filterOrder之所以可以排序,是因为Integer实现了Comparable接口,重写了compareTo方法


6.png


如果想自己定义排序规则可以通过实现Comparator接口,重写compare方法。


Collections.sort(list,new Comparator<Integer>(){
    @Override
    public int compare(Integer o1, Integer o2) {
        return o2 - o1;
    }
});


它的底层也是通过二分查找实现的

8.png


那么这两种方法有什么区别呢?


  • Comparable接口位于java.lang包下,而Comparator接口位于java.util包下。
  • Comparable接口是内部比较器,一个类如果想要使用Collections.sort(list) 方法进行排序,则需要实现该接口
  • Comparator接口是外部比较器用于对那些没有实现Comparable接口或者对已经实现的Comparable中的排序规则不满意进行排序.无需改变类的结构,更加灵活。


彩蛋


zuul中是通过filterOrder参数的大小排序的,而在spring中是通过@Order注解排序的。

3.png

默认情况下,如果不指定value值,则value是Integer的最大值。

由于排序规则是value越小,则排在越靠前,所以如果不指定value值,则它排在最后。

2.png

spring是通过OrderComparator类排序的,它实现了Comparator接口,它的doCompare方法实现的排序。

1.png

最终也是调用Integer类的compare方法,该方法前面已经介绍过了。

相关文章
|
小程序 数据库
一分钟教你学会小程序云开发的数据库的增删改查
本文简要介绍了小程序云开发中数据库的增删改查操作。首先展示了查询代码,通过`wx.cloud.database().collection().get()`获取数据;接着演示添加数据,强调数据字段需与数据库匹配;然后说明删除数据需基于_id,通过`doc(id).remove()`执行;最后,更新数据同样依赖_id,使用`doc(id).update()`进行修改。
758 1
|
前端开发 JavaScript
图解URL、URI和URN 区别
作为一名开发人员,特别的前端开发人员,已经无数次的听到过 URL 和 URI,对于 URN 可能听过的要少点,那么它们之间有什么区别呢?本文带大家巩固一下基本概念。
1105 0
图解URL、URI和URN 区别
|
存储 人工智能 安全
5款值的推荐的高效工具软件
本文介绍了五款实用工具软件:矢量设计工具Affinity Designer、数字绘画软件Sketchable、在线AI工具箱3171.CN、密码管理工具KeePassX及效率搜索软件Listary,涵盖设计、办公、安全与系统效率提升,助力高效工作。
771 0
|
存储 编译器 C语言
QT应用编程: 使用qcustomplot显示动态曲线、设计心电图显示页面
QT应用编程: 使用qcustomplot显示动态曲线、设计心电图显示页面
1651 0
QT应用编程: 使用qcustomplot显示动态曲线、设计心电图显示页面
|
8月前
|
Linux C语言 C++
C语言Qt编程基础(零基础入门Qt C语言开发指南)
本文介绍如何在C语言中借助C++封装调用Qt实现GUI开发。通过创建C兼容接口,结合Qt库与C主程序,初学者可快速入门C语言Qt编程,掌握跨语言混合开发技巧,为深入学习Qt打下基础。(238字)
使用QT的QProcess执行cmd命令【记录】
使用QT的QProcess执行cmd命令【记录】
2422 0
|
测试技术 定位技术 C++
QCustomPlot开发笔记(二):QCustomPlot用户交互、元素项以及特殊用法
QCustomPlot开发笔记(二):QCustomPlot用户交互、元素项以及特殊用法
QCustomPlot开发笔记(二):QCustomPlot用户交互、元素项以及特殊用法
|
安全 网络协议 Ubuntu
【常见开源库的二次开发】HTTP之libcurl库——libcurl使用(二)
【常见开源库的二次开发】HTTP之libcurl库——libcurl使用(二)
4406 3
|
缓存 Ubuntu 编译器
CMake 常见问题及解决办法
CMake 常见问题及解决办法
8326 0