美文网首页APP & program
【精】Filter 优先级规则(Order数字相同时规则)

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

作者: 小胖学编程 | 来源:发表于2022-08-25 22:03 被阅读0次

    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注解

    相关文章

      网友评论

        本文标题:【精】Filter 优先级规则(Order数字相同时规则)

        本文链接:https://www.haomeiwen.com/subject/ypvzgrtx.html