JAVA && Spring && SpringBoot2.x — 學習目錄
我們知道SpringBoot項目注冊Filter有如下三種方式
- 使用
@Bean
方式凰棉,將過濾器放入到SpringBean中端盆; - 使用
@Component
注解皂岔,將過濾器放入到SpringBean中信柿; - 使用
@WebFilter+@ServletComponentScan
囤捻,注冊過濾器评抚; - 使用
@Bean+FilterRegistrationBean
自定義對Filter進行添加熟空;
那么這么多方式谦秧,優(yōu)先級規(guī)則是如何的呢竟纳?
1. 規(guī)則
- @WebFilter優(yōu)先級為
@Order(Integer.MAX_VALUE)
,且無法配置疚鲤; - 其他方式可以通過@Order注解或者Ordered接口來配置優(yōu)先級(默認為
Integer.MAX_VALUE
锥累,數(shù)字越小,優(yōu)先級越高)集歇;
2. 當Order優(yōu)先值相同時規(guī)則
當Order的值相同時桶略。按照加載到FilterChain的先后順序決定優(yōu)先級。
當使用Order(Integer.MAX_VALUE)時诲宇。加載到FilterChain順序:
- @Bean+FilterRegistrationBean
- @WebFilter+@ServletComponentScan
- @Component & @Bean
3. 疑問點:PriorityOrdered接口會影響Filter順序嗎
不會际歼,PriorityOrdered會影響B(tài)ean加載的順序,但是不會影響Filter的順序姑蓝,可將其等效為Order注解鹅心。
ps:當Order優(yōu)先級相同時,將使用Bean加載的順序作為優(yōu)先級纺荧,此時會產(chǎn)生一些影響旭愧。
原因:無論何種方式注冊的Filter都將會被轉(zhuǎn)換為RegistrationBean對象颅筋,且重新設(shè)置優(yōu)先級。
源碼位置: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如何設(shè)置順序
使用AnnotationAwareOrderComparator
比較器來進行比較输枯。
詳看源碼:org.springframework.boot.web.servlet.ServletContextInitializerBeans#ServletContextInitializerBeans
系列文章
【精】SpringBoot2.x將Filter過濾器添加到容器
JAVA基礎(chǔ)篇(17)—ordered接口和order注解