У нас есть приложение Spring-Boot, которое мы запускаем, передавая некоторые аргументы через командную строку.
Мы хотим получить доступ к этим аргументам при получении ApplicationReadyEvent, чтобы выполнить некоторую логику при запуске приложения.
Я не могу заставить это работать. Пробовал с аннотацией @EventListener и даже с интерфейсом, но ничего не работает.
Я думаю, вы просто спрашиваете, как вы можете получить доступ к аргументам командной строки приложения внутри прослушивателя событий. Для этого вы можете просто внедрить bean-компонент ApplicationArguments в свой объект слушателя через его конструктор, например:
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
import java.util.Arrays;
@Component
public class Ready implements ApplicationListener<ApplicationReadyEvent> {
private ApplicationArguments appArgs;
public Ready(ApplicationArguments appArgs) {
this.appArgs = appArgs;
}
@Override
public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) {
System.out.println("App Args: " + Arrays.asList(appArgs.getSourceArgs()));
}
}
Получив объект ApplicationArguments, вы можете получить доступ к аргументам командной строки в виде массива с помощью метода getSourceArgs(). Я превращаю массив в список, чтобы он печатался правильно.
В качестве теста я передал три аргумента «a», «b» и «c» моему приложению при запуске, и эта строка печатается в конце запуска приложения:
App Args: [a, b, c]
да. Этот механизм не имеет ничего общего с прослушивателем событий конкретно. Вы можете сделать это с любым Bean-компонентом, внедрив его либо через параметры конструктора, либо через @Autowired. На самом деле, я сначала написал это как \@Autowired, но я поощрял людей использовать вместо этого внедрение конструктора, поэтому я изменил его, чтобы использовать внедрение конструктора. Работает в любом случае.
Работал как шарм, я сделал это с трудом, сделав фиктивную запись в application.properties и в основном классе, переопределяя свойства по умолчанию объектом приложения. Но приведенный выше выглядит намного чище. Смогу ли я получить доступ к этому в любом месте приложения, используя аннотацию @Autowired?