spring boot实战(第二篇)事件监听
前言
spring boot在啟動過程中增加事件監聽機制,為用戶功能拓展提供極大的便利。
支持的事件類型四種
ApplicationStartedEvent
ApplicationEnvironmentPreparedEvent
ApplicationPreparedEvent
ApplicationFailedEvent
實現監聽步驟:
1.監聽類實現ApplicationListener接口?
2.將監聽類添加到SpringApplication實例
ApplicationStartedEvent
ApplicationStartedEvent:spring boot啟動開始時執行的事件
創建對應的監聽類?MyApplicationStartedEventListener.java
?
package com.lkl.springboot.listener;import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; import org.springframework.boot.context.event.ApplicationStartedEvent; import org.springframework.context.ApplicationListener;/*** spring boot 啟動監聽類* * @author liaokailin* @version $Id: MyApplicationStartedEventListener.java, v 0.1 2015年9月2日 下午11:06:04 liaokailin Exp $*/ public class MyApplicationStartedEventListener implements ApplicationListener<ApplicationStartedEvent> {private Logger logger = LoggerFactory.getLogger(MyApplicationStartedEventListener.class);@Overridepublic void onApplicationEvent(ApplicationStartedEvent event) {SpringApplication app = event.getSpringApplication();app.setShowBanner(false);// 不顯示banner信息logger.info("==MyApplicationStartedEventListener==");} }?
?
?
?
在該事件中可以獲取到SpringApplication對象,可做一些執行前的設置.
?
Application.java類
?
package com.lkl.springboot;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;import com.lkl.springboot.listener.MyApplicationStartedEventListener;@SpringBootApplication public class Application {public static void main(String[] args) {SpringApplication app = new SpringApplication(Application.class); app.addListeners(new MyApplicationStartedEventListener());app.run(args);} }?
?
?
ApplicationEnvironmentPreparedEvent
ApplicationEnvironmentPreparedEvent:spring boot 對應Enviroment已經準備完畢,但此時上下文context還沒有創建。
MyApplicationEnvironmentPreparedEventListener.java
?
package com.lkl.springboot.listener;import java.util.Iterator;import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent; import org.springframework.context.ApplicationListener; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.MutablePropertySources; import org.springframework.core.env.PropertySource;/*** spring boot 配置環境事件監聽* @author liaokailin* @version $Id: MyApplicationEnvironmentPreparedEventListener.java, v 0.1 2015年9月2日 下午11:21:15 liaokailin Exp $*/ public class MyApplicationEnvironmentPreparedEventListener implementsApplicationListener<ApplicationEnvironmentPreparedEvent> {private Logger logger = LoggerFactory.getLogger(MyApplicationEnvironmentPreparedEventListener.class);@Overridepublic void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {ConfigurableEnvironment envi = event.getEnvironment();MutablePropertySources mps = envi.getPropertySources();if (mps != null) {Iterator<PropertySource<?>> iter = mps.iterator();while (iter.hasNext()) {PropertySource<?> ps = iter.next();logger.info("ps.getName:{};ps.getSource:{};ps.getClass:{}", ps.getName(), ps.getSource(), ps.getClass());}}}}?
?
?
?
?
在該監聽中獲取到ConfigurableEnvironment后可以對配置信息做操作,例如:修改默認的配置信息,增加額外的配置信息等等~~~
ApplicationPreparedEvent
ApplicationPreparedEvent:spring boot上下文context創建完成,但此時spring中的bean是沒有完全加載完成的。
MyApplicationPreparedEventListener.java
?
package com.lkl.springboot.listener;import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.context.event.ApplicationPreparedEvent; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationListener; import org.springframework.context.ConfigurableApplicationContext;/*** 上下文創建完成后執行的事件監聽器* * @author liaokailin* @version $Id: MyApplicationPreparedEventListener.java, v 0.1 2015年9月2日 下午11:29:38 liaokailin Exp $*/ public class MyApplicationPreparedEventListener implements ApplicationListener<ApplicationPreparedEvent> {private Logger logger = LoggerFactory.getLogger(MyApplicationPreparedEventListener.class);@Overridepublic void onApplicationEvent(ApplicationPreparedEvent event) {ConfigurableApplicationContext cac = event.getApplicationContext();passContextInfo(cac);}/*** 傳遞上下文* @param cac*/private void passContextInfo(ApplicationContext cac) {//dosomething()}}?
?
?
?
?
在獲取完上下文后,可以將上下文傳遞出去做一些額外的操作。
在該監聽器中是無法獲取自定義bean并進行操作的。
ApplicationFailedEvent
ApplicationFailedEvent:spring boot啟動異常時執行事件?
MyApplicationFailedEventListener.java
?
package com.lkl.springboot.listener;import org.springframework.boot.context.event.ApplicationFailedEvent; import org.springframework.context.ApplicationListener;public class MyApplicationFailedEventListener implements ApplicationListener<ApplicationFailedEvent> {@Overridepublic void onApplicationEvent(ApplicationFailedEvent event) {Throwable throwable = event.getException();handleThrowable(throwable);}/*處理異常*/private void handleThrowable(Throwable throwable) {}}?
?
?
?
?
在異常發生時,最好是添加虛擬機對應的鉤子進行資源的回收與釋放,能友善的處理異常信息。
在spring boot中已經為大家考慮了這一點,默認情況開啟了對應的功能:
?
public void registerShutdownHook() {if (this.shutdownHook == null) {// No shutdown hook registered yet.this.shutdownHook = new Thread() {@Overridepublic void run() {doClose();}};Runtime.getRuntime().addShutdownHook(this.shutdownHook);}}?
在doClose()方法中進行資源的回收與釋放。
總結
以上是生活随笔為你收集整理的spring boot实战(第二篇)事件监听的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringBoot(1.5.6.REL
- 下一篇: spring boot实战(第四篇)分散