Spring在运行时决定bean

时间:2017-02-06 19:34:47

标签: java spring spring-ioc

我有多个提供程序类(Provider1Provider2),如何根据Processor类中的输入参数决定使用哪个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
    }
}

2 个答案:

答案 0 :(得分:0)

这样的事情怎么样?

1#进入您的处理器类:

public class Processor{

    private Map<Provider> providers;

    public void process(String providerName) throws Exception {
        Provider provider = providers.get(providerName);
        provider.doOperation();
    }
}
在你的春季配置中

2#:

<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()

答案 1 :(得分:0)

这是Factory pattern的情况。您可以创建一个(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);
    }
}

您可以在应用程序启动时调用registerProvider方法,并根据需要添加任意数量的提供程序。初始化后,您可以调用getProvider方法并根据某些条件返回相应的实例。

请注意,providers并非必须是list,它可以是任何数据结构。这取决于哪种结构最适合您的标准。

Here的文档/更多工厂模式示例。