【Spring】标注@Order(100)和@Order(100)的两个过滤器谁会先执行呢?

1,335 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

今日闲来无事突发奇想,平时写Filter都想着把谁放谁前面,谁放谁后面,那么如果他俩撞了会咋样呢?

先看一下这个注解说明,里面直说的它有优先顺序,并没有说明顺序一样的情况

/*
@Order定义注释组件的排序顺序。
该value是可选的,表示Ordered接口中定义的订单值。较低的值具有较高的优先级。默认值为
Ordered.LOWEST_PRECEDENCE ,表示最低优先级(输给任何其他指定的订单值)。
注意:自 Spring 4.0 起,Spring 中的多种组件都支持基于注解的排序,即使是在考虑了目标组件的顺序值
(来自它们的目标类或来自它们的@Bean方法)的集合注入中也是如此。虽然这样的顺序值可能会影响注入点的优先级,
但请注意它们不会影响单例启动顺序,这是由依赖关系和@DependsOn声明确定的正交问题(影响运行时确定的依赖图)。
从 Spring 4.1 开始,标准的javax.annotation.Priority注释可以在订购场景中用作此注释的替代品。
请注意,当必须选择单个元素时, @Priority可能具有其他语义
(请参阅AnnotationAwareOrderComparator.getPriority )。
或者,也可以通过Ordered接口在每个实例的基础上确定顺序值,从而允许配置确定的实例值而不是附加到特定类的硬编码值。
有关无序对象的排序语义的详细信息,请参阅OrderComparator的 javadoc。
自从:
2.0
也可以看看:Ordered , AnnotationAwareOrderComparator , OrderUtils , javax.annotation.Priority
作者: 罗德·约翰逊、尤尔根·霍勒
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Documented
public @interface Order {

   /*
    订单价值。
    默认为Ordered.LOWEST_PRECEDENCE 。
    也可以看看:Ordered.getOrder()
    */
   int value() default Ordered.LOWEST_PRECEDENCE;
}

ps: 先说一下正常的执行顺序 负数优先级大于正数,说白了就是数轴的执行顺序。

说干就开干 =.= 随便新建个Springboot项目

新建两个过滤器

第一个

@Component
public class FirstFilter implements Filter, Ordered {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("执行了=====》"+ this.getClass().getSimpleName());
        filterChain.doFilter(servletRequest,servletResponse);
    }

   //这么写和@Order(222)效果一样
    @Override
    public int getOrder() {
        return 222;
    }
}

第二个

@Component
public class SecondFilter implements Filter, Ordered {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("执行了=====》"+ this.getClass().getSimpleName());
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public int getOrder() {
        return 222;
    }
}

然后再写个测试的Controller来访问

@Controller
public class TestController {
    @RequestMapping("/test")
    @ResponseBody
    public Object test() {
        return "66666666";
    }
}

此时访问controller,那么你就会看到输出:

执行了=====》FirstFilter
执行了=====》SecondFilter

都是222的order 为啥就First的先执行? 仅仅是因为名字?

所以为了验证猜想,我把FirstFilter类改名为ZFirstFilter,(因为Z在S后面嘛),然后运行,你就会发现输出变成了

执行了=====》SecondFilter
执行了=====》ZFirstFilter

这。。。。。所以得出结论,给过滤器设置相同的order顺序,会按照字母顺序执行。 哈哈,万一字母都是A开头呢?往后推着看呗。
真随意,改天闲下来再研究研究吧,溜了溜了。