ExitCodeGenerator 和 System.exit(0) 之间的区别

leb*_*ski 5 spring exit-code spring-boot

我最近了解到关闭 Spring Boot 应用程序的正确方法是:

public class Application {

    @Bean
    public ExitCodeGenerator exitCodeGenerator() {
        return new ExitCodeGenerator() {
            @Override
            public int getExitCode() {
                return 0;
            }
        };
    }

    public static void main(String[] args) throws Exception {
        System.exit(SpringApplication.exit(SpringApplication.run(Application.class, args)));
    }
}
Run Code Online (Sandbox Code Playgroud)

这应该返回退出代码 0,或者我将其配置为在getExitCode()方法中返回的任何内容。我的问题是 - 执行上述方法与执行以下方法有什么区别:

public class Application {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
        System.exit(0);
    }
}
Run Code Online (Sandbox Code Playgroud)

两种方法似乎都以完全相同的方式关闭应用程序,至少在控制台中是这样。那么有什么区别呢?

sar*_*316 3

如果您希望在调用 SpringApplication.exit() 时返回特定的退出代码,则可以使用 ExitCodeGenerator。然后可以将此退出代码传递给 System.exit() 以将其作为状态代码返回。

例如:

@SpringBootApplication
public class ExitCodeApplication {

@Bean
public ExitCodeGenerator exitCodeGenerator() {
    return new ExitCodeGenerator() {
        @Override
        public int getExitCode() {
            return 42;
        }
    };
}

public static void main(String[] args) {
    System.exit(SpringApplication
            .exit(SpringApplication.run(ExitCodeApplication.class, args)));
}

}
Run Code Online (Sandbox Code Playgroud)

此外,ExitCodeGenerator 接口可以通过异常来实现。当遇到此类异常时,Spring Boot 将返回已实现的 getExitCode() 方法提供的退出代码。