2017-03-02 7 views
0

springブートアプリケーションではapplication.ymlに複数の外部変数があり、私はこの変数に自分のJavaコードからアクセスしたいと思い、フィールド値に基づいて呼び出しをリダイレクトしたいさまざまな機能にSpringブートの外部フィールドに基づくメソッドの動的アクセス

例:

String externalVariable1 abc; 
String externalVariable2 xyz; 

method: if(string == abc) { 
call function1; } 
else { 
call function2; } 

今ここでの問題は、私は私のコアコードを変更することなく、外部変数への将来のほかに適応する必要があります堅牢な方法を書きたいfurtureで外部変数にさらに添加があるかもしれないです。私は、ヘルパーメソッドの一部として機能を追加するかもしれません。

私はリフレクションの方法を考えることができます、あなたは私が春のブートアプリケーションを使用しているより良いアプローチで私を助けることができます。

+0

yamlを使用して外部設定に関するドキュメントを読んだことはありますか? https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-yaml –

+0

私はそのYMLについては考えていません。プロパティファイルでもあります。私はプロパティファイルから外部フィールドを取得する場合は私が理解する必要があります、私は私のJavaメソッドで帽子の設計に従うことができるように最小限のコードを変更する場合は、プロパティファイルの外部変数を追加します。 –

答えて

0

これを反映させないでください。その代わり、戦略のいくつかの種類にfunction1/function2をラップは、オブジェクト:

interface Strategy { 
    void doStuff(); 
} 

class Function1 implements Strategy { 
    void doStuff() { 
     function1(); 
    } 
} 

class Function2 implements Strategy { 
    void doStuff() { 
     function2(); 
    } 
} 
その後

、いくつかの工場スタイルのクラスでこれらのすべてを登録します。

class StrategyFactory { 

    private Strategy defaultStrategy = new Function2(); 

    Map<String, Strategy> strategies = .... 
    strategies.put("abc", new Function1()); 
    ... 

    Strategy getStrategy(String key) { 
    return strategies.getOrDefault(key, defaultStrategy); 
    } 
} 

を最後に、それを使用する:

factory.getStrategy(valueFromYaml).doStuff(); 

Stringよりも複雑なオブジェクトにする必要がある場合は、keyを作成します。より複雑なシナリオのために食べたり、マップルックアップよりも高度な戦略を選択したりすることができます。

(これらのコンフィギュレーションは、DBやファイルから来ている場合など)を使用すると、マップ内Strategy実装のクラス名のみを保持し、実行する前に、利用可能な戦略がわからない場合:

Map<String, String> strategyClassNames = ...; 
strategy.put(keyFromDB, valueFromDB); 
... 

Class<? extends Strategy> strategy = Class.forName(strategyClassNames.get(key)); 
strategy.newInstance().doStuff(); 
関連する問題