本文已参与「新人创作礼」活动,一起开启掘金创作之路。
今日闲来无事突发奇想,平时写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开头呢?往后推着看呗。
真随意,改天闲下来再研究研究吧,溜了溜了。