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

藏宝库编辑 2024-9-3 03:31:07 49 0 来自 中国
JAVA && Spring && SpringBoot2.x — 学习目次

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

  • 利用@Bean方式,将过滤器放入到SpringBean中;
  • 利用@Component注解,将过滤器放入到SpringBean中;
  • 利用@WebFilter+@ServletComponentScan,注册过滤器;
  • 利用@Bean+FilterRegistrationBean自界说对Filter举行添加;
那么这么多方式,优先级规则是怎样的呢?
1. 规则


  • @WebFilter优先级为@Order(Integer.MAX_VALUE),且无法设置
  • 其他方式可以通过@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对象,且重新设置优先级。
1.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比力器来举行比力。
详看源码:org.springframework.boot.web.servlet.ServletContextInitializerBeans#ServletContextInitializerBeans
系列文章

【精】SpringBoot2.x将Filter过滤器添加到容器
JAVA根本篇(17)—ordered接口和order注解
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-22 00:23, Processed in 0.177471 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表