springboot启动事件退出钩⼦
1. 应⽤程序事件和
除了通常的Spring Framework事件之外,例如,SpringApplication发送⼀些额外的应⽤程序事件。
某些事件实际上是在ApplicationContext创建之前触发的,因此您⽆法在这些事件上注册侦听器@Bean。(bean是在applicationContext创建之后才实例化的)
您可以使⽤SpringApplication.addListeners(…)⽅法或SpringApplicationBuilder.listeners(…)⽅法注册它们。
如果您希望⾃动注册这些侦听器,⽆论应⽤程序的创建⽅式如何,可以向项⽬添加⽂件META-INF/spring.factories并使⽤该t.ApplicationListener键配置侦听器,如以下⽰例所⽰:t.ApplicationListener = ample.project.MyListener
应⽤程序运⾏时,应按以下顺序发送应⽤程序事件:
1. ⼀个ApplicationStartingEvent,是在⼀个运⾏的开始,但任何处理之前被发送,除了listeners 和initializers注册者。
2. ⼀个ApplicationEnvironmentPreparedEvent,Environment已知,但是在创建上下⽂之前。
3. ⼀个ApplicationPreparedEvent,是在刷新开始前,但bean定义已经被加载之后。
4. ⼀个ApplicationStartedEvent,上下⽂已被刷新后发送,但是在调⽤command-line runners 之前。
5. ⼀个ApplicationReadyEvent,command-line runners已经被调⽤。它表⽰应⽤程序已准备好为请求提供服务。
6. ⼀个ApplicationFailedEvent,如果在启动时异常发送。
2. ⽹络环境
⼀个SpringApplication试图创建正确类型的ApplicationContext。⽤于确定WebApplicationType的算法⾮常简单:
如果存在Spring MVC,则使⽤AnnotationConfigServletWebServerApplicationContext
如果Spring MVC不存在且存在Spring WebFlux,则使⽤AnnotationConfigReactiveWebServerApplicationContext
否则,AnnotationConfigApplicationContext使⽤
这意味着如果您WebClient在同⼀个应⽤程序中使⽤Spring MVC和Spring WebFlux中的新版本,则默认情况下将使⽤Spring MVC。您可以通过调⽤
setWebApplicationType(WebApplicationType)轻松覆盖它。
也可以完全控制ApplicationContext调⽤所使⽤的类型setApplicationContextClass(…)。
3.使⽤ApplicationRunner或CommandLineRunner
如果您需要在启动SpringApplication后运⾏某些特定代码,则可以实现ApplicationRunner或CommandLineRunner接⼝。
两个接⼝以相同的⽅式⼯作并提供单个run⽅法,该⽅法在SpringApplication.run(…)完成之前调⽤。
所述CommandLineRunner接⼝提供访问的应⽤程序的参数作为⼀个简单的字符串数组,⽽ApplicationRunner使⽤了ApplicationArguments前⾯所讨论的接⼝。以下⽰例显⽰
spring boot原理和生命周期
了CommandLineRunner⼀个run⽅法:
import org.springframework.boot.*;
import org.springframework.stereotype.*;
@Component
public class MyBean implements CommandLineRunner {
public void args) {
//
}
}
如果定义了必须按特定顺序调⽤的多个CommandLineRunner或ApplicationRunner bean,则可以另外实现Ordered接⼝或使⽤annotation.Order注
释。
4.应⽤退出
每个SpringApplication都注册⼀个JVM的关闭钩⼦,以确保ApplicationContext在退出时正常关闭。可以使⽤所有标准的Spring⽣命周期回调(例如DisposableBean接⼝或@PreDestroy注
释)。
此外,如果bean 在it()调⽤时希望返回特定的退出代码,则可以实现接⼝org.springframework.boot.ExitCodeGenerator。然后可以传递此退出代码it()以将其作为
状态代码返回,如以下⽰例所⽰:
@SpringBootApplication
public class ExitCodeApplication {
@Bean
public ExitCodeGenerator exitCodeGenerator() {
return () -> 42;
}
public static void main(String[] args) {
.exit(SpringApplication.run(ExitCodeApplication.class, args)));
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。