【精】Filter 优先级规则(Order数字相同时规则)

JAVA && Spring && SpringBoot2.x — 学习目录

我们知道SpringBoot项目注册Filter有如下三种方式

  1. 使用@Bean方式,将过滤器放入到SpringBean中;
  2. 使用@Component注解,将过滤器放入到SpringBean中;
  3. 使用@WebFilter+@ServletComponentScan,注册过滤器;
  4. 使用@Bean+FilterRegistrationBean自定义对Filter进行添加;

那么这么多方式,优先级规则是如何的呢?

1. 规则

  1. @WebFilter优先级为@Order(Integer.MAX_VALUE)且无法配置
  2. 其他方式可以通过@Order注解或者Ordered接口来配置优先级(默认为Integer.MAX_VALUE,数字越小,优先级越高);

2. 当Order优先值相同时规则

当Order的值相同时。按照加载到FilterChain的先后顺序决定优先级。

当使用Order(Integer.MAX_VALUE)时。加载到FilterChain顺序:

  • @Bean+FilterRegistrationBean
  • @WebFilter+@ServletComponentScan
  • @Component & @Bean

3. 疑问点:PriorityOrdered接口会影响Filter顺序吗

不会,PriorityOrdered会影响Bean加载的顺序,但是不会影响Filter的顺序,可将其等效为Order注解。

ps:当Order优先级相同时,将使用Bean加载的顺序作为优先级,此时会产生一些影响。

原因:无论何种方式注册的Filter都将会被转换为RegistrationBean对象,且重新设置优先级。

image.png

源码位置:org.springframework.boot.web.servlet.ServletContextInitializerBeans#addAsRegistrationBean(org.springframework.beans.factory.ListableBeanFactory, java.lang.Class<T>, java.lang.Class<B>, org.springframework.boot.web.servlet.ServletContextInitializerBeans.RegistrationBeanAdapter<T>)

4. 源码科普:Filter如何设置顺序

使用AnnotationAwareOrderComparator比较器来进行比较。

最终排序.png

详看源码:org.springframework.boot.web.servlet.ServletContextInitializerBeans#ServletContextInitializerBeans

系列文章

【精】SpringBoot2.x将Filter过滤器添加到容器
JAVA基础篇(17)—ordered接口和order注解

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容