sprintboot-learn(二)

Filter和Listener

Listener

自定義本身的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

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的方式配置能夠指定順序。

控制檯輸出:

@Bean的方式配置Listener和Filter

此種方式會用到兩個類:

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便可,測試經過。

CommendLineRunner啓動加載數據

示例工程:springboot-learn

自定義class,繼承CommendLineRunner,實現run方法。

啓動時加載數據會在tomcat啓動完以後加載數據,看結果:

註解@Order能夠決定加載的順序,值越小優先級越高。

 

over~~~

相關文章
相關標籤/搜索