Java Spring在运行时决定bean

Java Spring在运行时决定bean,java,spring,spring-ioc,Java,Spring,Spring Ioc,我有多个提供程序类(Provider1和Provider2),如何根据处理器类中的输入参数决定使用哪个bean public class Processor{ private Provider provider; public void process(String providerName) throws Exception { // What should I do here to invoke either provider1 or provider2

我有多个提供程序类(
Provider1
Provider2
),如何根据
处理器
类中的输入参数决定使用哪个bean

public class Processor{
    private Provider provider;

    public void process(String  providerName) throws Exception {
        // What should I do here to invoke either provider1 or provider2 depending on the providerName?
        provider.doOperation();
    }
}

public class Provider1  {
    public void doOperation(Exchange exchange) throws Exception {
        //Code
    }
}

public class Provider2  {
    public void doOperation(Exchange exchange) throws Exception {
        //Code
    }
}

像这样的事情怎么样

1#进入处理器类:

public class Processor{

    private Map<Provider> providers;

    public void process(String providerName) throws Exception {
        Provider provider = providers.get(providerName);
        provider.doOperation();
    }
}
公共类处理器{
私人地图供应商;
公共无效进程(字符串提供程序名)引发异常{
Provider=providers.get(providerName);
provider.doOperation();
}
}
2#在spring配置中:

<bean id="provider1" class="xx.yy.zz.Provider1"/>
<bean id="provider2" class="xx.yy.zz.Provider2"/>

<bean id="processor" class="xx.yy.zz.Processor">

  <property name="providers">
    <map>
        <entry key="provider1" value-ref="provider1" />
        <entry key="provider2" value-ref="provider2" />
    </map>
  </property>

</bean>


现在,例如,如果您调用
processor.process(“provider1”)
它将调用
provider1.doOperation()
,这就是
工厂模式的情况。您可以创建(
ProviderFactory
)类,注册所有提供程序并根据值获取提供程序,例如:

class ProviderFactory(){

    private List<Provider> providers = new ArrayList<>();

    public Provider getProvider(String input){

        if(input.equals("test1")){
            //Find based on criteria
            return provider1;
        }else if(input.equals("test2")){
            //Find based on criteria
            return provider2;
        }
    }

    public void registerProvider(Provider provider){
        providers.add(provider);
    }
}
class ProviderFactory(){
私有列表提供程序=新的ArrayList();
公共提供程序getProvider(字符串输入){
if(input.equals(“test1”)){
//根据标准查找
退货供应商1;
}else if(input.equals(“test2”)){
//根据标准查找
退货供应商2;
}
}
公共无效注册表提供程序(提供程序){
提供者。添加(提供者);
}
}
您可以在应用程序启动时调用
registerProvider
方法,并添加所需数量的提供程序。初始化后,您可以调用
getProvider
方法,并根据某些条件返回适当的实例

请注意,
提供者
不一定需要是
列表
,它可以是任何数据结构。这取决于哪种结构最适合您的标准

的文档/有关Factory模式的更多示例