SpringBoot中的配置檔案詳解(yml、properties全域性配置和自定義配置、有趣的banner圖配置)

語言: CN / TW / HK

全域性配置檔案

全域性配置檔案能夠對一些預設配置值進行修改。Spring Boot使用一個application.properties或者application.yaml的檔案作為全域性配置檔案,該檔案存放在src/main/resource目錄或者類路徑的/config,一般會選擇resource目錄。接下來,將針對這兩種全域性配置檔案進行講解∶

application.properties配置檔案

使用Spring lnitializr方式構建Spring Boot專案時,會在resource目錄下自動生成一個空的application.properties檔案,Spring Boot專案啟動時會自動載入application.properties檔案。我們可以在application.properties檔案中定義Spring Boot專案的相關屬性,當然,這些相關屬性可以是系統屬性、環境變數、命令引數等資訊,也可以是自定義配置檔名稱和位置。 properties server.port=17006 spring.config.name=zjq spring.application.name=zjq-properties spring.redis.host=localhost spring.redis.port=6039 spring.redis.password= spring.redis.database=0 接下來,通過一個案例對Spring Boot專案中application.properties配置檔案的具體使用進行講解。 演示:準備兩個實體類檔案,演示將application.properties配置檔案中的自定義配置屬性注入到PropertiesConfig實體類的對應屬性中

  1. 建立兩個實體類Goods和PropertiesConfig ```java @Data public class Goods {

    private Integer id; private String name; }

@ConfigurationProperties(prefix = "zjq-prop") @Component @Data public class PropertiesConfig {

private Integer id;
private String username;
private List hobby;
private String[] family;
private Map map;
private Goods goods;

} ``@ConfigurationProperties: 將配置檔案中以zjqProp開頭的屬性通過setXxx方法注入到該類的屬性中@Component`: 把PropertiesConfig類作為Bean到spring容器中,只有這樣才能@ConfigurationProperties註解進行賦值

  1. 在resources目錄下建立的application.properties檔案配置如下:

image.png 編寫application.properties配置檔案時,由於要配置的PropertiesConfig物件屬性是我們自定義的,Spring Boot無法自動識別,所以不會有任何書寫提示。在實際開發中,為了出現程式碼提示的效果來方便配置,在使用@ConfigurationProperties註解進行配置檔案屬性值注入時,可以在pom.xml檔案中新增一個SpringBoot提供的配置處理器依賴: ```xml

org.springframework.boot spring-boot-configuration-processor true ``` 在pom.xml中新增上述配置依賴後,還需要重新執行專案啟動類或者使用“Ctrl+F9"快捷鍵(即BuildProject)重構當前Spring Boot專案方可生效。 效果如下: image.png

  1. 檢視application.properties配置檔案是否正確,同時檢視屬性配置效果,建立專案測試類,在該測試類中引入PropertiesConfig實體類Bean,並進行輸出測試。 ```java @RunWith(SpringRunner.class) // 測試啟動類,並載入Spring Boot測試註解 @SpringBootTest //標記為SpringBoot測試類,並載入ApplicationContext上下文環境 public class ConfigTest {

    @Autowired private PropertiesConfig propertiesConfig; @Test public void propertiesConfigTest(){ System.out.println(propertiesConfig); } } ``` 輸出如下: image.png 至此,說明application.properties配置檔案屬性配置正確,並通過相關注解自動完成了屬性注入。

    application.yaml配置檔案

    YAML檔案格式是Spring Boot支援的一種JSON超集檔案格式,相較於傳統的Properties配置檔案,YAML檔案以資料為核心,是一種更為直觀且容易被電腦識別的資料序列化格式。application.yaml配置檔案的工作原理和application.properties是一樣的,只不過yaml格式配置檔案看起來更簡潔一些。我本人開發過程中一般用這種格式,更簡潔更有層次感。 YAML檔案的副檔名可以使用.yml或者.yaml。 application.yml檔案使用“key:(空格)value"格式配置屬性,使用縮排控制層級關係。這裡,針對不同資料型別的屬性值,介紹一下YAML

    value值為普通資料型別(例如數字、字串、布林等)

    當YAML配置檔案中配置的屬性值為普通資料型別時,可以直接配置對應的屬性值,同時對於字串型別的屬性值,不需要額外新增引號,示例程式碼如下 image.png

    value值為陣列和單列集合

    當YAML配置檔案中配置的屬性值為陣列或單列集合型別時,主要有兩種書寫方式︰縮排式寫法和行內式寫法。縮排式有兩種寫法,行內式寫法如下: yaml zjq-yml: #縮排式寫法1 hobby: - 爬山 - 羽毛球 - 籃球 #縮排式寫法2 hobby: 爬山, 羽毛球, 籃球 #行內式寫法 hobby:[爬山,羽毛球,籃球] 通過上述示例對比發現,YAML配置檔案的行內式寫法更加簡明、方便。另外,包含屬性值的中括號“[”還可以進一步省略,在進行屬性賦值時,程式會自動匹配和校對

    value值為Map集合和物件

    當YAML配置檔案中配置的屬性值為Map集合或物件型別時,YAML配置檔案格式同樣可以分為兩種書寫方式:縮排式寫法和行內式寫法。 yaml zjq-yml: #縮排式寫法 map: name: 共飲一杯無 feature: 相當哇塞 #行內式寫法 map: {"name":"共飲一杯無","feature":"相當哇塞"} 在YAML配置檔案中,配置的屬性值為Map集合或物件型別時,縮排式寫法的形式按照YAML檔案格式編寫即可,而行內式寫法的屬性值要用大括號“"包含。 接下來,在Properties配置檔案演示案例基礎上,通過配置application.yaml配置檔案對YmlConfig物件(屬性同上述PropertiesConfig類)進行賦值,具體使用如下

  2. 在專案的resources目錄下,新建一個application.yml配置檔案,在該配置檔案中編寫為YmlConfig類設定的配置屬性。 ```yaml zjq-yml: id: 666 username: 共飲一杯無 hobby:

    • 爬山
    • 羽毛球
    • 籃球 family: [father,mother,wife] #縮排式寫法

map:

name: 共飲一杯無

feature: 相當哇塞

#行內式寫法 map: {"name":"共飲一杯無","feature":"相當哇塞"} goods: {"id":"666","name":"宇宙飛船"} ```

  1. 執行測試驗證 ```java @Autowired private YmlConfig ymlConfig;

    @Test public void ymlConfigTest(){ System.out.println(ymlConfig); } ``` 輸出如下: image.png 💡注意:application.properties和application.yml如果配置相同屬性,application.properties會覆蓋application.yml的配置。

    配置檔案屬性值的注入使用

    Spring Boot全域性配置檔案設定屬性時: 如果配置屬性是Spring Boot已有屬性,例如服務埠server.port,那麼Spring Boot內部會自動掃描並讀取這些配置檔案中的屬性值並覆蓋預設屬性。 如果配置的屬性是使用者自定義屬性,例如剛剛自定義的Person實體類屬性,還必須在程式中注入這些配置屬性方可生效。 Spring Boot支援多種注入配置檔案屬性的方式,下面來介紹如何使用註解@ConfigurationProperties和@Value注入屬性

    使用@ConfigurationProperties注入屬性

    Spring Boot提供的@ConfigurationProperties註解用來快速、方便地將配置檔案中的自定義屬性值批量注入到某個Bean物件的多個對應屬性中。上述全域性配置properties和yml配置程式碼使用@Component和@ConfigurationProperties(prefix = "zjq-prop")將配置檔案中的每個屬性對映到PropertiesConfig類元件中。此處不再贅述。

    使用@Value注入屬性

    @Value註解是Spring框架提供的,用來讀取配置檔案中的屬性值並逐個注入到Bean物件的對應屬性中,Spring Boot框架從Spring框架中對@value註解進行了預設繼承,所以在Spring Boot框架中還可以使用該註解讀取和注入配置檔案屬性值。使用@Value注入屬性的示例程式碼如下。 配置類: ```java @Configuration @Data public class ValueConfig {

    @Value("${my.name}") private String name;

    @Value("${my.address}") private String address;

    @Value("${my.feature}") private String feature; } 上述程式碼中,使用@Configuration和@Value注入Person實體類的id屬性。其中,@Value不僅可以將配置檔案的屬性注入Person的id屬性,還可以直接給id屬性賦值,這點是@ConfigurationProperties不支援的 配置檔案:yaml my: name: zjq-dev address: zjq-小溪 feature: 帥的雅痞 測試驗證:java @Autowired private ValueConfig valueConfig;

    @Test public void valueConfigTest(){ System.out.println(valueConfig); } ``` 輸出如下: image.png 可以看出,測試方法valueConfigTest()執行成功,同時正確打印出了ValueConfig實體類物件。需要說明的是,本示例中只是使用@Value註解對例項中Student物件的普通型別屬性進行了賦值演示,而@Value註解對於包含Map集合、物件以及YAML檔案格式的行內式寫法的配置檔案的屬性注入都不支援,如果賦值會出現錯誤。

    自定義配置

    spring Boot免除了專案中大部分的手動配置,對於一些特定情況,我們可以通過修改全域性配置檔案以適應具體生產環境,可以說,幾乎所有的配置都可以寫在application.peroperties檔案中,Spring Boot會自動載入全域性配置檔案從而免除我們手動載入的煩惱。但是,如果我們自定義配置檔案,Spring Boot是無法識別這些配置檔案的,此時就需要我們手動載入。接下來,將針對Spring Boot的自定義配置檔案及其載入方式進行講解

    使用@PropertySource載入配置檔案

    對於這種載入自定義配置檔案的需求,可以使用@PropertySource註解結合@Configuration註解配置類的方式來實現。@PropertySource註解用於指定自定義配置檔案的具體位置和名稱。同時,為了保證Spring Boot能夠掃描該註解,還需要類上新增@Configuration註解將實體類作為自定義配置類。當然,如果需要將自定義配置檔案中的屬性值注入到對應類的屬性中,可以使用@ConfigurationProperties或者@Value註解進行屬性值注入 演示:

  2. 開啟Spring Boot專案的resources目錄,在專案的類路徑下新建一個zjq.properties自定義配置檔案,在該配置檔案中編寫需要設定的配置屬性。 properties zjq.name=詹先生 zjq.age=18 zjq.feature=帥

  3. 新建立一個配置類CustomPropertiesConfig,提供zjq.properties自定義配置檔案中對應的屬性,並根據@PropertySource註解的使用進行相關配置 ```java /**

  4. 自定義配置
  5. @author zjq
  6. @date 2021/9/11 23:03
  7. title:

  8. description:

    * 要使用@ConfigurationProperties需要在主類指定@EnableConfigurationProperties / @ConfigurationProperties(prefix = "zjq") @PropertySource("classpath:zjq.properties") @Configuration @Data public class CustomPropertiesConfig {

    private String name;

    private Integer age;

    private String feature; } ``` 主要是一個自定義配置類,通過相關注解引入了自定義的配置檔案,並完成了自定義屬性值的注入。針對示例中的幾個註解,具體說明如下:

  9. @Configuration註解表示當前類是一個自定義配置類,並新增為Spring容器的元件,這裡也可以使用傳統的@Component註解;

  10. @PropertySource("classpath:zjq.properties")註解指定了自定義配置檔案的位置和名稱,此示例表示自定義配置檔案為classpath類路徑下的test.properties檔案;
  11. @ConfigurationProperties(prefix = "zjq")註解將上述自定義配置檔案zjq.properties中以zjq開頭的屬性值注入到該配置類屬性中。
  12. 如果配置類上使用的是@Component註解而非@Configuration註解,那麼@EnableConfigurationProperties註解還可以省略。
  13. 進行測試 ```java @Autowired private CustomPropertiesConfig customPropertiesConfig;

    @Test public void customPropertiesConfigTest(){ System.out.println(customPropertiesConfig); } ``` 可以正常輸出配置。 image.png

    使用@Configuration編寫自定義配置類

    在Spring Boot框架中,推薦使用配置類的方式向容器中新增和配置元件。 在Spring Boot框架中,通常使用@Configuration註解定義一個配置類,Spring Boot會自動掃描和識別配置類,從而替換傳統Spring框架中的XML配置檔案。 當定義一個配置類後,還需要在類中的方法上使用@Bean註解進行元件配置,將方法的返回物件注入到Spring容器中,並且元件名稱預設使用的是方法名,當然也可以使用@Bean註解的name或value屬性自定義元件的名稱 演示:

  14. 新建立一個類MyService,該類中不需要編寫任何程式碼 java public class MyService { } 建立了一個空的MyService類,而該類目前沒有新增任何配置和註解,因此還無法正常被Spring Boot掃描和識別

  15. 新建一個配置類MyConfig,並使用@Configuration註解將該類宣告一個配置類,內容如下: ```java @Configuration // 定義該類是一個配置類 public class MyConfig { @Bean // 將返回值物件作為元件新增到spring容器中,該元件id預設為方法名 public MyService myService() {

    return new MyService();
    

    } } ``` MyConfig是@Configuration註解宣告的配置類(類似於聲明瞭一個XML配置檔案),該配置類會被Spring Boot自動掃描識別;使用@Bean註解的myService()方法,其返回值物件會作為元件新增到了Spring容器中(類似於XML配置檔案中的標籤配置),並且該元件的id預設是方法名myService。

  16. 進行測試 java @Autowired private ApplicationContext applicationContext; @Test public void iocTest() { System.out.println(applicationContext.containsBean("myService")); } 上述程式碼中,先通過@Autowired註解引入了Spring容器例項ApplicationContext,然後在測試方法iocTest()中測試檢視該容器中是否包括id為myService的元件。 從測試結果可以看出,測試方法iocTest()執行成功,顯示執行結果為true,表示Spirng的IOC容器中也已經包含了id為myService的例項物件元件,說明使用自定義配置類的形式完成了向Spring容器進行元件的新增和配置。

隨機數設定及引數間引用

在Spring Boot配置檔案中設定屬性時,除了可以像前面示例中顯示的配置屬性值外,還可以使用隨機值和引數間引用對屬性值進行設定。下面,針對配置檔案中這兩種屬性值的設定方式進行講解。

隨機值設定

在Spring Boot配置檔案中,隨機值設定使用到了Spring Boot內嵌的RandomValuePropertySource類,對一些隱祕屬性值或者測試用例屬性值進行隨機值注入。 隨機值設定的語法格式為${random.xx},xx表示需要指定生成的隨機數型別和範圍,它可以生成隨機的整數、uuid或字串,示例程式碼如下: yaml my: secret: ${random.value} # 配置隨機值 number: ${random.int} #配置隨機整數 bignumber: ${random.long} # 配置隨機long型別數 uuid: ${random.uuid} # 配置隨機uuid型別數 number: less: than: ten: ${random.int(10)} #配置小於10的隨機整數 in: range: ${random.int[1024,65536]} # 配置範圍在[ 1024,65536]之間的隨機整 上述程式碼中,使用RandomValuePropertySource類中random提供的隨機數型別,分別展示了不同型別隨機值的設定示例。

引數間引用

在Spring Boot配置檔案中,配置檔案的屬性值還可以進行引數間的引用,也就是在後一個配置的屬性值中直接引用先前已經定義過的屬性,這樣可以直接解析其中的屬性值了。 使用引數間引用的好處就是,在多個具有相互關聯的配置屬性中,只需要對其中一處屬性預先配置,其他地方都可以引用,省去了後續多處修改的麻煩 引數間引用的語法格式為${xx},xx表示先前在配置檔案中已經配置過的屬性名,示例程式碼如下 properties app.name=MyApp app.description=$ {app.name} is a Spring Boot application 上述引數間引用設定示例中,先設定了"app.name=MyApp",將app.name屬性的屬性值設定為了MyApp;接著,在app.description屬性配置中,使用${app.name}對前一個屬性值進行了引用 接下來,通過一個案例來演示使用隨機值設定以及引數間引用的方式進行屬性設定的具體使用和效果,具體步驟如下

  1. 開啟Spring Boot專案resources目錄下的application.properties配置檔案,在該配置檔案中分別通過隨機值設定和引數間引用來配置兩個測試屬性,示例程式碼如下 yaml spring: cloud: nacos: discovery: server-addr: 127.0.0.1:8848 namespace: f70bfdsfb-6fdsf3-43fd-9eba-8a5dsfsge81 config: server-addr: ${spring.cloud.nacos.discovery.server-addr} namespace: ${spring.cloud.nacos.discovery.namespace}

  2. 測試類驗證 ```java @Value("${spring.cloud.nacos.config.server-addr}") private String addr; @Value("${spring.cloud.nacos.config.namespace}") private String namespace;

    @Test public void placeholderTest() { System.out.println("addr:"+addr); System.out.println("namespace:"+namespace); } ``` 輸出如下: image.png

    banner圖定義

    在resources目錄下建立banner.txt檔案,專案啟動的時候會載入裡面的banner圖。 還可以配置一些屬性資訊:

  3. ${AnsiColor.BRIGHT_RED}:設定控制檯中輸出內容的顏色

  4. ${application.version}:用來獲取MANIFEST.MF檔案中的版本號
  5. ${application.formatted-version}:格式化後的${application.version}版本資訊
  6. ${spring-boot.version}:Spring Boot的版本號
  7. ${spring-boot.formatted-version}:格式化後的${spring-boot.version}版本資訊

我的banner.txt檔案配置如下: ```latex ${AnsiColor.BRIGHT_BLUE} ${spring-boot.version}

                      /$$$$$$             /$$$$$$                      /$$
                     /$$__  $$           /$$__  $$                    | $$

/$$$$$$$$ /$$ /$$$$$$ | $$ _/ /$$$$$$ | $$ _/ /$$$$$$ /$$$$$$ | $$ |_ /$$/|_/ /$$ $$| $$$$$$ /$$ $$| $$ /$$ $$ /$$ $$| $$ /$$$$/ /$$| $$ \ $$ ____ $$| $$ \ $$| $$ | $$ \ $$| $$ \ $$| $$ /$$/ | $$| $$ | $$ /$$ \ $$| $$ | $$| $$ $$| $$ | $$| $$ | $$| $$ /$$$$$$$$| $$| $$$$$$$| $$$$$$/| $$$$$$/| $$$$$$/| $$$$$$/| $$$$$$/| $$ |__/| $$ _ $$ _/ ______/ ______/ ______/ ______/ |/ /$$ | $$ | $$ | $$$$$$/ | $$ __/ |/

//////////////////////////////////////////////////////////////////// // ooOoo // // o8888888o // // 88" . "88 // // (| ^^ |) // // O\ = /O // // ____/---'\____ // // .' \\| |//. // // / \||| : |||// \ // // / ||||| -:- |||||- \ // // | | \\ - /// | | // // | _| ''---/'' | | // // \ .-__ - /-. / // // . .' /--.--\. . // // ."" '< .___\_<|>_/___.' >'"". // // | | :- `.;\ _ /;./ - : | | // // \ \ -. \_ __\ /__ _/ .- / / // // ========-.____-.__/.-____.-'======== // //=---=' // // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // // 佛祖保佑 永不宕機 永無BUG // ////////////////////////////////////////////////////////////////////

更多banner參考網站: http://patorjk.com/software/taag/#p=display&f=Graffiti&t=zjq https://www.degraeve.com/img2txt.php#sample ``` 效果如下: image.png 😄😄😄可以用來鎮壓bug。

本文內容到此結束了,\ \ 如有收穫歡迎點贊👍收藏💖關注✔️,您的鼓勵是我最大的動力。\ \ 如有錯誤❌疑問💬歡迎各位大佬指出。    \ \ 主頁共飲一杯無的部落格彙總👨‍💻\      \ 保持熱愛,奔赴下一場山海。🏃🏃🏃\ \ a37032f76d3ebe77e3e3d265ff1e1d7.jpg