Spring Boot: как настроить набор реализаций для внедрения? - PullRequest
0 голосов
/ 06 мая 2020

В моем приложении Spring Boot у меня есть события , которые должны быть сообщены различными способами, в зависимости от среды.

Я определил interface IReporter и несколько реализации, а именно LogReporter, EmailReporter, RpcReporter. Также в будущем могут появиться новые реализации.

Теперь я хочу, чтобы о моих событиях сообщалось с помощью подмножества репортеров. Подмножество должно быть указано в конфигурации приложения следующим образом (например):

events.reporters=LogReporter,EmailReporter

или

events.reporters=${EVENT_REPORTERS}

или что-то подобное.

В результате, Я хотел бы, чтобы компонент, который обрабатывает события (скажем, class EventHandler), имел магически внедренный List<IReporter> myReporters, содержащий только необходимые реализации. И, конечно же, если создается новая реализация, обновлять нужно только конфигурацию приложения (а не код EventHandler).

Я знаком с внедрением всех доступных реализаций, только @Primary реализация или специфика c, выбранная с @Qualifier. Но похоже, что это не решает мою проблему.

1 Ответ

0 голосов
/ 06 мая 2020
class EventHandler {

        @Value("${events.reporter}")
        List<String> requiredImplementation;

        @Autowired
        List<IReporter> myReporters;

        public List<IReporter> getRequiredImplementation() {
            return myReporters.stream()
                    .filter(reporter -> requiredImplementation.contains(reporter.getClass().getSimpleName()))
                    .collect(Collectors.toList());
        }
    }

EDIT: один вариант, который я мог бы подумать, если мы хотим, чтобы структура автоматически подключала только необходимые bean-компоненты, мы можем исследовать @ ConditionalOnExpression.

Например:

@Component
@ConditionalOnExpression("#{'${events.reporter}'.contains('LogReporter')}")
Class LogReporter {
}

@Component
@ConditionalOnExpression("#{'${events.reporter}'.contains('EmailReporter')}")
Class EmailReporter {
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...