我有多个提供程序类(Provider1
和Provider2
),如何根据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
}
}
答案 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的文档/更多工厂模式示例。