Как я могу программно выключение Spring загрузки приложений , не выключая виртуальную машину ?
В других произведениях то, что противоположно
new SpringApplication(Main.class).run(args);
java
spring
spring-boot
Аксель Фонтен
источник
источник
Ответы:
Закрытие в
SpringApplication
основном означает закрытие базового активаApplicationContext
. ЭтотSpringApplication#run(String...)
метод дает вам этоApplicationContext
какConfigurableApplicationContext
. Вы можете тогдаclose()
это сами.Например,
В качестве альтернативы вы можете использовать
static
SpringApplication.exit(ApplicationContext, ExitCodeGenerator...)
вспомогательный метод, который сделает это за вас. Например,источник
ExitCodeGenerator
можно использовать. Вы можете просто вернуться изmain
метода для корректного выхода (код выхода 0).В приложении с весенней загрузкой вы можете использовать что-то вроде этого
ShutdownManager.java
источник
ApplicationContext
можно автоматически вводить в другие beans.Это работает, даже сделано напечатано.
Итак, добавив
.close()
послеrun()
Пояснение:
и:
По сути, он не закрывает родительский контекст, поэтому виртуальная машина не закрывается.
источник
SpringApplication.exit(appContext, () -> returnCode)
.SpringApplication.run(MyApplication.class, args)
, родительский контекст отсутствует. Есть только один контекст, контекст, созданный и возвращенныйrun
, который вы затем немедленноclose
. @ Майкл прав. Это не сработает для программ, которым нужно что-либо делать после инициализации контекста Spring, а это большинство программ.В приложении можно использовать
SpringApplication
. У этого есть статическийexit()
метод, который принимает два аргумента:ApplicationContext
иExitCodeGenerator
:то есть вы можете объявить этот метод:
Внутри интеграционных тестов вы можете добиться этого, добавив
@DirtiesContext
аннотацию на уровне класса:@DirtiesContext(classMode=ClassMode.AFTER_CLASS)
- Связанный ApplicationContext будет помечен как грязный после тестового класса.@DirtiesContext(classMode=ClassMode.AFTER_EACH_TEST_METHOD)
- Связанный ApplicationContext будет помечен как грязный после каждого тестового метода в классе.т.е.
источник
Это обеспечит правильное закрытие приложения SpringBoot и возврат ресурсов в операционную систему.
источник