上節課我們講解了過濾器,這節課進行監聽器Listener的講解, 監聽器是一個專門用於對其他對象身上發生的事件或狀態改變進行監聽和相應處理的對象,當被監視的對象發生情況時,立即採取相應的行動。通俗的講,監聽器就比如你盯着一盤好喫的,有人拿你的喫的的時候,你會立馬採取相應的行動。
此處我們以ServletRequestListener以及ServletContextListener來舉例,ServletRequestListener與ServletContextListener都是接口,ServletRequestListener接口是用來監聽請求的,裏面有兩個方法,分別是請求創建和請求銷燬,ServletContextListener是用來監聽Servlet容器的,裏面有兩個方法,分別是容器創建和容器銷燬。我們實現自定義監聽器是使用最新的Servlet3.0的註解方式實現的,非常的方便!(2.5不支持註解),如果跟我上篇Filter使用bean的方式實現Listener也是可以的,只是這裏沒做
一.自定義請求監聽器
創建一個RequestListener監聽器實現ServletRequestListener接口,並實現創建以及銷燬方法,注意加上@WebListener註解,這樣Web容器就會把它當做一個監聽器進行註冊和使用了
@WebListener
public class RequestListener implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("======requestDestroyed========");
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("======requestInitialized========");
}
}
然後寫一個接口加上打印,
@RequestMapping("/litener/index")
public String listenerIndex(){
System.out.println("--------controller處理中-----");
return "index";
}
最後啓動項目發送一個請求:http://localhost:8081/litener/index,監聽器起作用!
二.自定義容器監聽器
創建一個ContextListener監聽器實現ServletContextListener接口,並實現創建以及銷燬方法
@WebListener
public class ContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("======contextInitialized========");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("======contextDestroyed========");
}
}
然後重啓應用,發現在容器應用剛啓動的時候監聽器就啓動了。
監聽器與filter一樣,直接關閉應用是看不到容器銷燬的,只有在熱部署的時候才能看到contextDestroyed()方法裏面的打印(不瞭解熱部署的可以看我之前的博文https://blog.csdn.net/qq_33355821/article/details/86616794)
熱部署的時候會先銷燬Filter,再銷燬Listener,因爲容器是最先加載的,他要在最後銷燬
應用場景:listener主要做一些資源的加載,比如在項目啓動的時候加載一些redis緩存的數據,做一些統計比如在線人數等等,他是新開的一個線程,不會干擾主線程的啓動,比較方便
下面列舉一些常用的監聽器,我們只要實現他們的接口就行了:
1.ServletContextListener -- 監聽servletContext對象的創建以及銷燬
1.1 contextInitialized(ServletContextEvent arg0) -- 創建時執行
1.2 contextDestroyed(ServletContextEvent arg0) -- 銷燬時執行
2.HttpSessionListener -- 監聽session對象的創建以及銷燬
2.2 sessionCreated(HttpSessionEvent se) -- 創建時執行
2.2 sessionDestroyed(HttpSessionEvent se) -- 銷燬時執行
3.ServletRequestListener -- 監聽request對象的創建以及銷燬
3.1 requestInitialized(ServletRequestEvent sre) -- 創建時執行
3.2 requestDestroyed(ServletRequestEvent sre) -- 銷燬時執行
4.ServletContextAttributeListener -- 監聽servletContext對象中屬性的改變
4.1 attributeAdded(ServletContextAttributeEvent event) -- 添加屬性時執行
4.2 attributeReplaced(ServletContextAttributeEvent event) -- 修改屬性時執行
4.3 attributeRemoved(ServletContextAttributeEvent event) -- 刪除屬性時執行
5.HttpSessionAttributeListener --監聽session對象中屬性的改變
5.1 attributeAdded(HttpSessionBindingEvent event) -- 添加屬性時執行
5.2 attributeReplaced(HttpSessionBindingEvent event) -- 修改屬性時執行
5.3 attributeRemoved(HttpSessionBindingEvent event) -- 刪除屬性時執行
6.ServletRequestAttributeListener --監聽request對象中屬性的改變
6.1 attributeAdded(ServletRequestAttributeEvent srae) -- 添加屬性時執行
6.2 attributeReplaced(ServletRequestAttributeEvent srae) -- 修改屬性時執行
6.3 attributeRemoved(ServletRequestAttributeEvent srae) -- 刪除屬性時執行
參考:https://blog.csdn.net/m0_38075425/article/details/81164501
源碼地址:https://gitee.com/xuxinsunqizheng/SpringBoot2.0.git