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对象,且重新设置优先级。
源码位置: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注解