你會配置SpringBoot的Filter、Servlet、Listener 嗎?

前言

Spring Framework有一個核心控制器 - DispatcherServlet,其配置在web.xml文件中的。它將攔截匹配(自己定義攔截匹配規則)到的請求,依據相應的規則分發到目標Controller來處理。現在我們先回想下Filter、Servlet、Listener、Interceptor在Spring Framework是如何配置和先後的執行順序?

一般情況下,用戶通過瀏覽器發起Request請求進入服務器後處理順序如下:

你會配置SpringBoot的Filter、Servlet、Listener 嗎?

在講解SpringBoot中如何配置Servelt、Filter、Listener之前,我們先來回顧下它們在Spring Framework如何配置的?這裡不再講解它們的用法。

一、Servlet 2.5配置Servlet、Filter、Listener

配置web.xml

你會配置SpringBoot的Filter、Servlet、Listener 嗎?

二、Servlet 3.0配置Servlet、Filter、Listener

我們知道在Servlet3.0新特性中提供動態註冊和註解@WebServlet 、@WebListener、@WebFilter,在不配置web.xml時仍可以註冊Servlet、Filter、Listener。

1、通過動態註冊配置

你會配置SpringBoot的Filter、Servlet、Listener 嗎?

2、通過註解配置

Servlet配置

你會配置SpringBoot的Filter、Servlet、Listener 嗎?

Filter配置

你會配置SpringBoot的Filter、Servlet、Listener 嗎?

注:

Servlet3規範不支持註解Filter的配置執行順序,這裡指的配置執行順序就像web.xml中定義的順序。

其實可以採用非常不優雅的方式控制Filer的執行順序,即通過控制filter的文件名來控制。如果不採用此種方式我們仍需在web.xml中定義,web.xml中定義的的順序就是他們的執行順序。

你會配置SpringBoot的Filter、Servlet、Listener 嗎?

Listener配置

你會配置SpringBoot的Filter、Servlet、Listener 嗎?

使用註解配置Servlet、Filter、Listener,是不是清爽了很多。@WebServlet 、@WebListener、@WebFilter可以完全代替web.xml中的配置。

三、SpringBoot配置Servlet、Filter、Listener

Spring Boot集成了servlet容器,當我們在pom文件中增加spring-boot-starter-web的maven依賴時,不做任何web相關的配置便能提供web服務,這還得歸於Spring Boot自動配置的功能(因為加了EnableAutoConfiguration的註解),幫我們創建了一堆默認的配置,以前在web.xml中配置,現在都可以通過spring bean的方式和註解進行配置,由Spring來進行生命週期的管理,大多數情況下,我們需要重載這些配置,如:修改服務的啟動端口,contextpath,filter,listener,

servlet,session超時時間等。

Spring Boot提供了ServletRegistrationBean、FilterRegistrationBean、ServletListenerRegistrationBean

和@WebServlet、@WebFilter、@WebListener三種類型分別配置應用的Servlet、Filter、Listener。

1、通過@Component讓Spring掃描配置

你會配置SpringBoot的Filter、Servlet、Listener 嗎?

2、通過@Configuration和@Bean來配置

你會配置SpringBoot的Filter、Servlet、Listener 嗎?

3、通過@Configuration和@Bean和FilterRegistrationBean更靈活的配置

你會配置SpringBoot的Filter、Servlet、Listener 嗎?

4、通過@ServletComponentScan自動掃描@WebServlet, @WebFilter, @WebListener

你會配置SpringBoot的Filter、Servlet、Listener 嗎?

Spring Boot中,Filter、Listener、Interceptor執行順序即時定義@Order(註解表示執行過濾順序,值越小,越先執行),仍無效。執行順序的規則和Servlet3.0是一致的。

四、擴展

SpringBoot在使用SpringMVC的時候不需要配置DispatcherServlet,因為SpringBoot已經自動配置了。如果我們想要加一些初始配置參數如何解決?方案如下:

你會配置SpringBoot的Filter、Servlet、Listener 嗎?

可以通過注入DispatcherServlet,然後用ServletRegistrationBean包裹一層 動態的加上一些初始參數。

五、總結

SpringBoot集中註冊方案效果都是一樣,在內部SpringBoot的實現上是無差別的,即使使用的是Servlet3.0註解,也是通過掃描註解轉換成這三種bean的FilterRegistrationBean、ServletRegistrationBean、ServletListenerRegistrationBean。

Servlet、Filter或Listener註冊成Spring Bean,由於這三者與容器有關,它們不會被延遲初始化!Servlet、Filter、Listener可以使用ServletRegistrationBean、FilterRegistrationBean、ServletListenerRegistrationBean來設置初始化參數和映射路徑。


分享到:


相關文章: