ExitCodeGenerator 接口用于从 SpringApplication 运行的命令行生成“退出代码”。
Spring Boot 为确保 ApplicationContext 在退出时优雅的关闭,每个 SpringApplication 都会注册一个 JVM 的 shutdown 钩子,所有标准的 Spring 生命周期回调都能使用。比如:DisposableBean 接口或 @PreDestroy 注解。
此外,如果想在 Spring Boot 应用结束时返回特定的退出码(exit code),我们自己的 beans 可以实现 org.springframework.boot.ExitCodeGenerator 接口。
(1)实现 ExitCodeGenerator 接口,生成自己的退出代码。代码如下:
import org.springframework.boot.ExitCodeGenerator; import org.springframework.stereotype.Component; @Component public class MyExitCodeGenerator implements ExitCodeGenerator { @Override public int getExitCode() { System.out.println("========= MyExitCodeGenerator ========="); return 100; } }
上面自定义的 ExitCodeGenerator 通过 @Component 注解注入到 Spring 容器。
(2)测试代码。如果你使用 IDEA 运行 Spring Boot,直接点击 IDEA 的关闭按钮停止 Spring Boot 是不会触发自定义的 ExitCodeGenerator。因此,我们需要使用 ConfigurableApplicationContext 类的 close() 方法去停止 Spring Boot。代码如下:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; import java.util.Map; @RestController @SpringBootApplication public class AppArgDemo3 { private static ConfigurableApplicationContext context; public static void main(String[] args) { context = SpringApplication.run(AppArgDemo3.class, args); } @RequestMapping("/exit") public void exit(){ if(null != context) { context.close(); System.out.println("Spring Boot exit success."); } else { System.out.println("ConfigurableApplicationContext is null"); } } }
上面代码中,在 exit() 方法中调用了 ConfigurableApplicationContext 的 close() 方法去关闭 Spring Boot 应用。