2017-08-30 51 views
10

所以我有一個application.yml文件爲我的春季啓動應用程序,像這樣:春季啓動公約變量

spring: 
    url: localhost 
email: 
    from: [email protected] 
app: 
    uuid: 3848348j34jk2dne9 

我想在我的應用程序連線這些配置的屬性分爲不同的組件,像這樣:

@Component 
public class FooA { 
    private final String url; 

    public FooA(@Value("${spring.url}") String url) { 
     this.url = url 
    } 
} 

@Component 
public class FooB { 
    private final String from; 

    public FooA(@Value("${email.from}") String from) { 
     this.from = from 
    } 
} 

@Component 
public class FooC { 
    private final String uuid; 

    public FooA(@Value("${app.uuid}") String uuid) { 
     this.uuid = uuid 
    } 
} 

上述工作正如我的應用程序中預期的那樣。但我的問題是,如果這是春季啓動的最佳做法。我所知道的唯一另一種替代方法是使用Properties對象,方法是在配置類中創建一個bean,使用所有配置變量加載屬性,並將屬性bean自動裝入組件。

這種情況下的最佳做法是什麼?

回答

17

正如您已經確定注入配置的兩個主要選擇是在單獨的屬性上使用@Value或在javabean配置對象上使用@ConfigurationProperties

您使用哪一個歸結爲偏好。我個人更喜歡使用配置對象。使用@ConfigurationProperties可以使用JSR-303 bean驗證。
如果你願意,你也可以在你的javabean的setter中編寫自己的自定義驗證。
您可以從非Spring項目中註釋配置Bean,它允許您編寫易於配置但不依賴於spring的庫。
您可以從可能使您的開發過程更流暢的對象中生成IDE元數據。

以下是我在使用彈簧配置時推薦的一些做法。

  • 爲您的應用程序的邏輯組件創建個人對象@ConfigurationProperties。儘量保持模塊化,避免爲整個應用程序配置創建一個垃圾場。

  • 不要在多個位置使用相同的@Value屬性。
    如果您的應用程序中的多個位置需要相同的配置,那麼您應該將該值移動到配置對象中。
    在多個@Value批註中使用相同的屬性使得難以推理,而且如果您通過「SpEL」表達式在一個地方而不是另一個地方定義默認值,還可能導致意外行爲。

  • 不要在spring命名空間中定義自己的屬性。
    例如您的spring.url財產is not one of the properties defined in the documentation
    通過使用相同的名稱空間,您可能會冒該名稱用於未來的spring-boot版本中的風險。

+0

我不認爲理查德正在考慮使用'@ConfigurationProperties'。我讀他的問題的方式,他正在考慮在他的'@Configuration'類中手動創建和填充一個bean。所以'@ConfigurationProperties'將是一個很大的改進。另外,如果添加spring-boot-configuration-processor,則可以爲IDE生成配置元數據,以用於自動完成/驗證/文檔,這非常酷! –