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 应用。
