Код: Выделить всё
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
Код: Выделить всё
@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Я пробовал подходы, такие как использование @qualifier на отдельных бобах, но, похоже, не работает чисто, когда картирование нескольких реализаций Enum. /> [*] Существует ли функция или шаблон пружины, которая позволяет мне автоматически разобраться с картой автоматически?
[*] Могу ли я избежать ручного строительства карты в методе @bean
Есть ли лучшие практики для реализации множественных услуг в этом способе? быть высоко ценим.
Подробнее здесь: https://stackoverflow.com/questions/797 ... into-a-map