Доступ к аргументам командной строки из Spring Beans (в данном случае прослушиватель ApplicationReadyEvent)

У нас есть приложение Spring-Boot, которое мы запускаем, передавая некоторые аргументы через командную строку.

Мы хотим получить доступ к этим аргументам при получении ApplicationReadyEvent, чтобы выполнить некоторую логику при запуске приложения.

Я не могу заставить это работать. Пробовал с аннотацией @EventListener и даже с интерфейсом, но ничего не работает.

0
0
776
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, вы просто спрашиваете, как вы можете получить доступ к аргументам командной строки приложения внутри прослушивателя событий. Для этого вы можете просто внедрить 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]

Работал как шарм, я сделал это с трудом, сделав фиктивную запись в application.properties и в основном классе, переопределяя свойства по умолчанию объектом приложения. Но приведенный выше выглядит намного чище. Смогу ли я получить доступ к этому в любом месте приложения, используя аннотацию @Autowired?

Siddharth Chaurasia 13.04.2019 21:45

да. Этот механизм не имеет ничего общего с прослушивателем событий конкретно. Вы можете сделать это с любым Bean-компонентом, внедрив его либо через параметры конструктора, либо через @Autowired. На самом деле, я сначала написал это как \@Autowired, но я поощрял людей использовать вместо этого внедрение конструктора, поэтому я изменил его, чтобы использовать внедрение конструктора. Работает в любом случае.

CryptoFool 13.04.2019 21:47

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