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==========");
}
}