Autowire несколько бобов в картуJAVA

Программисты JAVA общаются здесь
Anonymous
Autowire несколько бобов в карту

Сообщение Anonymous »

Я работаю над приложением Spring Boot, в котором у меня есть несколько реализаций сервисного интерфейса, и я хочу автоматически провести их в карту , представленную типом перечисления.

Код: Выделить всё

public interface PaymentService {
void processPayment();
}
< /code>
@Slf4j
@Service
@PaymentHandler(PaymentType.CREDIT_CARD)
public class CreditCardPaymentService implements PaymentService {

@Override
public void processPayment() {
log.info("CreditCardPaymentService processPayment");
}
}
< /code>
@Slf4j
@Service
@PaymentHandler(PaymentType.VENMO)
public class VenmoPaymentService implements PaymentService {

@Override
public void processPayment() {
log.info("VenmoPaymentService processPayment");
}
}
< /code>
public enum PaymentType {
CREDIT_CARD, VENMO
}
< /code>
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Component
public @interface PaymentHandler {
PaymentType value();
}
< /code>
Currently, I’m manually creating a Map
в классе конфигурации с использованием ApplicationContext :

Код: Выделить всё

@Configuration
public class PaymentConfiguration {

@Bean
public Map
 paymentServicesMap(final ApplicationContext applicationContext) {
return applicationContext.getBeansOfType(PaymentService.class).values().stream()
.flatMap(service ->
Optional.ofNullable(service.getClass().getAnnotation(PaymentHandler.class))
.map(annotation -> Map.entry(annotation.value(), service))
.stream())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
}
}
< /code>
@Component
@RequiredArgsConstructor
public class MyStartupRunner implements CommandLineRunner {
private final Map paymentServices;

@Override
public void run(String... args) {
paymentServices.forEach((paymentType, paymentService) -> paymentService.processPayment());
}
}
< /code>
This approach works, but it feels verbose and manual. I’d like to leverage Spring’s @Qualifier
или какая -то другая функция, чтобы избежать необходимости определять карту Bean явно. В идеале, я хочу, чтобы Spring автоматически вводила карту без дополнительной котельки.
Я пробовал подходы, такие как использование @qualifier на отдельных бобах, но, похоже, не работает чисто, когда картирование нескольких реализаций Enum. /> [*] Существует ли функция или шаблон пружины, которая позволяет мне автоматически разобраться с картой автоматически?
[*] Могу ли я избежать ручного строительства карты в методе @bean
Есть ли лучшие практики для реализации множественных услуг в этом способе? быть высоко ценим.

Подробнее здесь: https://stackoverflow.com/questions/797 ... into-a-map

Вернуться в «JAVA»