我最近了解到关闭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);
}
}
两种方法似乎都以完全相同的方式关闭应用程序,至少在控制台中是这样。那有什么区别?
答案 0 :(得分: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()方法提供的退出代码。
答案 1 :(得分:0)
当然,对于您的示例,这无关紧要。但是,这允许将某些异常“粘合”到某个退出代码。默认情况下,Spring会捕获您的代码可能引发的所有异常-如果此类异常也实现了ExitCodeGenerator
-将用于输出您提供的退出代码。
当然,您可以手动进行映射,但是很多更加冗长且难以维护。春天使这变得容易。理解之后,您可能会对ExitCodeExceptionMapper
感兴趣,该{@ 1}}可以将基础Exception
(假设有多个错误消息)映射到不同错误代码。