Spring ExitCodeGenerator和System.exit之间的差异(0)

Spring ExitCodeGenerator和System.exit之间的差异(0),spring,spring-boot,exit-code,Spring,Spring Boot,Exit Code,我最近了解到关闭Spring Boot应用程序的正确方法是: public class Application { @Bean public ExitCodeGenerator exitCodeGenerator() { return new ExitCodeGenerator() { @Override public int getExitCode() { return 0;

我最近了解到关闭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)));
    }
}
这应该返回0的退出代码,或者我在
getExitCode()
方法中将其配置为返回的任何代码。我的问题是-采用上述方法与采用以下方法有什么区别:

public class Application {

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

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

如果您希望在调用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)));
}

}

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

当然,对于您的示例来说,这并不重要。但这允许将某个异常“粘合”到某个退出代码。默认情况下,Spring捕获代码可能抛出的所有异常(如果此类异常还实现了
ExitCodeGenerator
),这些异常将用于输出您提供的退出代码


当然,您可以手动进行映射,但它更为冗长,更难维护;春天使这更容易。一旦理解了这一点,您可能还会对能够将基础
异常
(假设有多条错误消息)映射到不同错误代码的
ExitCodeExceptionMapper
感兴趣

似乎我也可以用另一种方式返回特定的退出代码。我刚刚在
SpringApplication.run()
方法之后执行了
System.exit(42)
,应用程序以42的退出代码结束。您能更新这个答案并提供一些示例吗?