Как создать несколько экземпляров одного типа с компонентами Spring на основе конфигурации? - PullRequest
1 голос
/ 27 апреля 2020

Я пытаюсь выяснить, как создать несколько экземпляров bean-компонентов подклассов класса на основе конфигураций application.properties.

В качестве примера, по сути, у меня есть несколько внутренних служб для обработки платежей, с соответствующими Интеграции, созданные как подклассы родительского типа интеграции, скажем: PaymentProcessorAlpha и ProcessorBeta, которые расширяют класс PaymentProcessor.

Теперь, что кажется непростой задачей, я хочу иметь возможность настраивать различные экземпляры объектов, обработанных процессором (в идеале Spring Beans, но если это просто объекты, которые в порядке) для списка заданных валют, как настроено в файле application.properties.

Таким образом, в зависимости от конфигурации в application.properties:

CurrencyProcessorStuff.processors.USD=alpha
CurrencyProcessorStuff.processors.CAD=alpha
CurrencyProcessorStuff.processors.GBP=beta
CurrencyProcessorStuff.processors.MXN=beta
CurrencyProcessorStuff.processors.AUS=beta

(я могу использовать приведенную выше конфигурацию для заполнения свойства Map «процессоров» CurrencyProcessorStuff Бин с картой строки, строки, являющейся названием валюты и именем обработчика, то есть <«USD» -> «Альфа», «CAD» -> «Альфа», et c ...)

Я хочу создать пять экземпляров PaymentProcessor, два с подтипом PaymentProcessorAlpha и три с подтипом PaymentProcessorBeta, и иметь возможность ссылаться на правильный экземпляр на основе валюты, с которой я имею дело в данный момент, либо с использованием разных имен бинов , @Qualifier, или просто создав карту этих объектов с ключом названия валюты.

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

A) Я могу использовать полный класс имена в конфигурации, вместо «альфа», и я могу вручную создавать новые объекты этих имен классов и создавать себе Map of CurrencyName-> ProcessorObjects.

Мне это не нравится, потому что мне приходится вручную кодировать полные имена классов, сохранять все в синхронизации c, и я не получаю Spring Beans, только POJO.

B ) Я могу создать фабричные классы для каждого типа процессора, автоматически связать их в коллекцию, идентифицированную по имени класса или имени классификатора, а затем вызвать соответствующий фабричный компонент для создания POJO для моей карты (аналогично опции А, но без кодирования полных имен классов в файл .properties.

Я вижу, как вы можете использовать Qualifier, чтобы получить правильный подтип Бина для заданного свойства с помощью Autowiring, но я не выяснил, как получить несколько экземпляров каждого подпрограммы. -типа и иметь хороший способ назвать / найти каждый компонент, и т. д. c ... управляемый с помощью конфигураций файла .properties.

Любые мысли приветствуются!

...