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