2017-02-06 6 views
0

複数のプロバイダクラス(Provider1およびProvider2)がありますが、Processorクラスの入力パラメータに応じて、どのBeanを使用するかを決定するにはどうすればよいですか。実行時にSpringが決定する

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

このようなものは何ですか?お使いのプロセッサのクラスに

1#:あなたの春のconfigに

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

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のファクトリパターンの例/その他の例

関連する問題