首页 > 解决方案 > 如何根据配置创建多个与Spring bean同类型的实例?

问题描述

我试图弄清楚如何根据 application.properties 配置创建类的子类的多个实例 bean。

例如,基本上我有多个用于支付处理的后端服务,各自的集成构建为父集成类型的子类,比如:PaymentProcessorAlpha 和 ProcessorBeta,它们都扩展了 PaymentProcessor 类。

现在,看起来棘手的部分是,我希望能够为给定货币列表配置不同的处理器实例化对象(理想情况下是 Spring Bean,但如果它们只是对象,那没关系),如 application.properties 文件中配置的那样.

所以根据application.properties中的配置:

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

(我可以使用上面的配置来填充 CurrencyProcessorStuff Bean 的“处理器”映射属性,其中包含字符串、字符串的映射,即货币名称和处理器名称,即 <“USD”->“Alpha”、“CAD”- >“阿尔法”等...)

我想创建五个 PaymentProcessor 实例、两个 PaymentProcessorAlpha 子类型和三个 PaymentProcessorBeta 子类型,并且能够根据我目前处理的货币引用正确的实例,或者通过不同的 bean 名称, @Qualifier,或者简单地通过使用货币名称的键创建这些对象的 Map 。

我相信我可以解决这两种不同的方法,但感觉都不是很干净或像 Spring,所以我希望有更好的方法。

A) 我可以在配置中使用完整的类名,而不是“alpha”,我可以手动创建这些类名的新对象,并为自己构建一个 CurrencyName->ProcessorObjects 的映射。

我不喜欢这样,因为我必须手动编写完整的类名,保持一切同步,而且我没有得到 Spring Bean,只有 POJO。

B)我可以为每种处理器类型创建工厂类,将它们自动装配到由类名或限定符名标识的集合中,然后调用适当的工厂 Bean 为我的地图生成 POJO(类似于选项 A,但无需编码完整的类名进入 .properties 文件。

我看到了如何使用 Qualifier 通过自动装配来获取给定属性的 Bean 的正确子类型,但我还没有弄清楚如何获取每个子类型的多个实例并且有一种很好的命名/查找方法每个 bean 等...通过 .properties 文件配置进行管理。

任何想法将不胜感激!

标签: javaspringspring-bootautowired

解决方案


推荐阅读