2017-03-02 39 views
0

我們在spring引導應用程序的application.yml中有多個外部變量,我想從我的java代碼中訪問這個變量,並基於字段值來重定向調用到各種功能。Spring引導中基於外部字段的方法的動態訪問

例子:

String externalVariable1 abc; 
String externalVariable2 xyz; 

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

現在,這裏的問題是可能會有進一步的除未來編外部變量,我想寫這應該是適應未來除了外部變量不改變我的核心代碼可靠的方法。我可能會將這些功能添加爲輔助方法的一部分。

所有我能想到的反射方式,你們可以幫助我更好的方法,因爲我使用的是spring引導應用程序。

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

使key更復雜的對象,而不僅僅是String如果您需要適應吃更復雜的場景,或者使用比地圖查找更復雜的方式來選擇策略。

如果你不知道可用的策略運行時之前(例如,如果這些配置來自於一個數據庫或文件),只保留在地圖Strategy實現的類名稱:

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

和使用它:

Class<? extends Strategy> strategy = Class.forName(strategyClassNames.get(key)); 
strategy.newInstance().doStuff(); 
相關問題