前言
本文主要介紹如何在SpringBoot 2 中使用 Listener 的快速搭建教程,閱讀前需要你必須瞭解 Listener 的基礎使用以及如何搭建 SpringBoot 項目。
快速演示操作
第一步: 編寫 Listener 並且在 Listener 類上聲明 @WebListener 註解。具體代碼如下:
@WebListener
public class ApplicationListener implements ServletContextListener{
private Logger log = LoggerFactory.getLogger(ApplicationListener.class);
@Override
public void contextInitialized(ServletContextEvent sce) {
log.info("ApplicationListener 監聽器啓動...");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
log.info("ApplicationListener 監聽器銷燬...");
}
}
第二步:通過 JavaConfig 方式將編寫的 ApplicationListener 類注入到 Spring 的上下文中。
將自定義 ApplicationListener 傳入到 ServletListenerRegistrationBean的構造中,然後創建 ServletListenerRegistrationBean Bean實例,具體代碼如下:
@Configuration
public class WebApplicationConfig {
@Bean
public ServletListenerRegistrationBean<ApplicationListener> userServlet(){
return new ServletListenerRegistrationBean<ApplicationListener> (new ApplicationListener());
}
}
或者在啓動類上聲明 @ServletComponentScan 註解,具體代碼如下:
@SpringBootApplication
@ServletComponentScan
public class SpringbootExamplesApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootExamplesApplication.class, args);
}
}
測試
啓動 SpirngBoot 項目會看到在 ApplicationListener 中定義 ApplicationListener 監聽器銷燬… 日誌信息。
2019-10-04 00:58:39.361 INFO 5184 --- [ restartedMain] o.s.b.w.servlet.ServletRegistrationBean : Servlet dispatcherServlet mapped to [/]
2019-10-04 00:58:39.375 INFO 5184 --- [ restartedMain] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*]
2019-10-04 00:58:39.376 INFO 5184 --- [ restartedMain] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2019-10-04 00:58:39.376 INFO 5184 --- [ restartedMain] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'formContentFilter' to: [/*]
2019-10-04 00:58:39.377 INFO 5184 --- [ restartedMain] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*]
2019-10-04 00:58:39.420 INFO 5184 --- [ restartedMain] c.lijunkui.listener.ApplicationListener : ApplicationListener 監聽器啓動...
在啓動狀態下在此啓動該項目,雖然會報錯但是可以看到在ApplicationListener 中定義銷燬的日誌信息輸出。
Caused by: java.net.BindException: Address already in use: bind
at sun.nio.ch.Net.bind0(Native Method) ~[na:1.8.0_144]
at sun.nio.ch.Net.bind(Net.java:433) ~[na:1.8.0_144]
at sun.nio.ch.Net.bind(Net.java:425) ~[na:1.8.0_144]
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223) ~[na:1.8.0_144]
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74) ~[na:1.8.0_144]
at org.apache.tomcat.util.net.NioEndpoint.initServerSocket(NioEndpoint.java:236) ~[tomcat-embed-core-9.0.12.jar:9.0.12]
at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:210) ~[tomcat-embed-core-9.0.12.jar:9.0.12]
at org.apache.tomcat.util.net.AbstractEndpoint.start(AbstractEndpoint.java:1108) ~[tomcat-embed-core-9.0.12.jar:9.0.12]
at org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:550) ~[tomcat-embed-core-9.0.12.jar:9.0.12]
at org.apache.catalina.connector.Connector.startInternal(Connector.java:957) ~[tomcat-embed-core-9.0.12.jar:9.0.12]
... 19 common frames omitted
2019-10-04 01:01:07.860 INFO 7864 --- [ restartedMain] o.apache.catalina.core.StandardService : Stopping service [Tomcat]
2019-10-04 01:01:07.863 INFO 7864 --- [ restartedMain] c.lijunkui.listener.ApplicationListener : ApplicationListener 監聽器銷燬...
2019-10-04 01:01:07.876 INFO 7864 --- [ restartedMain] ConditionEvaluationReportLoggingListener :
小結
SpringBoot 中整合 Listener步驟如下:
- 需要在Listener上聲明 @WebListener
- 在啓動類上聲明@ServletComponentScan註解或者將
Listener通過ServletListenerRegistrationBean 進行包裝然後通過 JavaConfig
方式將其注入到Spring上下文中。
代碼示例
我本地環境如下:
SpringBoot Version: 2.1.0.RELEASE
Apache Maven Version: 3.6.0
Java Version: 1.8.0_144
IDEA:Spring Tools Suite (STS)
整合過程如出現問題可以在我的GitHub 倉庫 springbootexamples 中模塊名爲 spring-boot-2.x-listener 項目中進行對比查看
GitHub:https://github.com/zhuoqianmingyue/springbootexamples
參考文獻
Springboot 系列(六)web 開發之攔截器和三大組件 By 雪漫士兵