Разница между ExitCodeGenerator и System.exit(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);
    }
}

Кажется, что приложение закрывается одинаково обоими подходами, по крайней мере, в консоли. Так в чем же разница?

1 ответ

ExitCodeGenerator используется, если вы хотите вернуть определенный код завершения при вызове SpringApplication.exit(). Этот код завершения затем может быть передан в 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 который может отображать базовый Exception(с несколькими сообщениями об ошибках) на разные коды ошибок.

Другие вопросы по тегам