自定義本身的Listener,繼承須要重寫的監聽器。web
方式一:直接在自定義監聽器上面添加註解@WebListener,可是單純這樣是不會被掃描到的(實測不能),因此咱們須要加@Component註解,實測@Configuration也行。@WebListener的屬性value是對改Listener的描述,感受沒有做用。spring
Controller接口:tomcat
須要使用session,session纔會初始化。springboot
看控制檯輸出:session
啓動項目,初始化ServletContext測試
訪問接口localhost:8080/test2,使用session,初始化session:url
方式二:自定義接口中不寫@Component或者@configuration註解,只要@WebListener註解,在啓動類中添加註解@ServletComponentScan註解,效果與上面同樣。spa
Filter的使用配置方式個Listener是同樣的,這裏就不討論了,直接使用在啓動類添加註解@ServletCompnentScan的方式。3d
自定義Filter:blog
MyFilter:
Myfilter2:
能夠看到兩個Filter上面的註解@WebFilter:
屬性: value:配置須要過濾的url路徑,/*表示全部,類型String[]
urlPartterns:跟value同樣
filterName:過濾器的名字,若是重複,會引發覆蓋(這個在另一種方式會提到)。
啓動項目:
過濾器中doFilter方法當中,chain.doFilter(request, response)必須寫,目的是該過濾器完成後,交給後邊的過濾器繼續執行,若是不寫,則直接在此處中斷。
訪問url:
能夠看到過濾器2攔截路徑/test,不會攔截到/test2,過濾器已經生效。
過濾器的執行過程(跟Listener有點點相似):
注意箭頭的到達的地方:
這種@ServletComponentScan的配置方式,過濾器的執行順序暫時還沒找到方法控制,測試@Order註解對Filter的執行順序無效。可是,不使用@ServletComponentScan,改爲使用@Component註解的方式的話,@Order對Filter的執行順序就有做用了,值越小優先級越高(如圖)。或者使用後面的@Bean的方式配置能夠指定順序。
控制檯輸出:
此種方式會用到兩個類:
FilterRegistrationBean和ServletListenerRegistrationBean
在官方文檔part IV .27.3.可是沒有講怎麼使用,用法是百度的。
使用該方式的時候自定義過濾器上面不須要有任何註解,只須要繼承Filter便可。
直接在主類中添加@Bean代碼(固然,也能夠從新建一個類寫,爲該類添加@Configuration註解便可):
這裏會出現兩個FilterRegistrationBean,兩個都是能夠用,建議使用web.servlet的,context.embedded中的是web.servlet中的子類,並且已通過時。
注意:有多少個Filter就要寫多少個@Bean方法。
優先級:setOrder方法就是用來設置Filter的執行順序。值越小,優先級越高。
如今講MyFilter2設置成1,MyFilter設置成2:執行結果:
Listener的配置和Filter的同樣,使用@Bean的方式能夠不用在子類上添加任何註解,只須要繼承須要的Listener便可,測試經過。
示例工程:springboot-learn
自定義class,繼承CommendLineRunner,實現run方法。
啓動時加載數據會在tomcat啓動完以後加載數據,看結果:
註解@Order能夠決定加載的順序,值越小優先級越高。
over~~~