Spring Boot應用上下文啓動前後代碼執行插入點

Spring Boot 提供了若干個代碼執行點的事件和監聽器,見 Application events and listeners

Spring Boot 可以使用內置的 tomcat 啓動,也可以使用外部的,依據打包方式的不同,實現代碼略有不同。

1. 打成 jar,使用內置的 tomcat 啓動:

@SpringBootApplication
@ServletComponentScan
@MapperScan("com.hebta.plato.dao")
public class PlatoApplication {
	private Logger logger = LoggerFactory.getLogger(PlatoApplication.class);
	
	public static void main(String[] args) {
		SpringApplication springApplication = new SpringApplication(PlatoApplication.class);
	    
	    springApplication.addListeners( new BeforeStartEvent() );
	    springApplication.run(args);
	}
	
	// Boot 上下文啓動完畢,可以對外提供請求服務的時候立即執行的
	@EventListener(ApplicationReadyEvent.class)
	public void whenReady(){
		logger.info("=========ApplicationReadyEvent=========");
	}
}

// Boot 上下文啓動之前執行的
class BeforeStartEvent implements ApplicationListener<ApplicationEnvironmentPreparedEvent >{
	private Logger logger = LoggerFactory.getLogger(BeforeStartEvent.class);
    @Override public void onApplicationEvent(ApplicationEnvironmentPreparedEvent  event) {
    	logger.info("++++++++++BeforeStartEvent+++++++++");
    }	
}

2. 打成 war 包,放到外部的 tomcat 裏面運行:

/**
 * 如果工程需要打成 jar 包並放到外部的tomcat裏面,需要當前類促使Servlet容器加載 Spring Boot的啓動類。 
 * 由於需要使用外部的tomcat,pom 文件裏面需要將 tomcat-starter的scope調成provided
 *
 */
public class ServletInitializer extends SpringBootServletInitializer {
	
	@Override
	protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {	
		application.listeners(new BeforeStartEvent(), new AfterEvent());
		return application.sources(PlatoApplication.class);
	}
}

// Boot 上下文啓動之前執行的
class BeforeStartEvent implements ApplicationListener<ApplicationEnvironmentPreparedEvent >{
	private Logger logger = LoggerFactory.getLogger(BeforeStartEvent.class);
    @Override public void onApplicationEvent(ApplicationEnvironmentPreparedEvent  event) {
    	logger.info("++++++++++BeforeStartEvent+++++++++");
    }	
}

// Boot 上下文啓動完畢,可以對外提供請求服務的時候立即執行的
class AfterEvent implements ApplicationListener<ApplicationReadyEvent>{
	private Logger logger = LoggerFactory.getLogger(AfterEvent.class);
    @Override public void onApplicationEvent(ApplicationReadyEvent event) {
    	logger.info("==========AfterEvent==========");
    }	
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章