日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

SpringBoot(3)—配置文件详解:Properties和YAML

發(fā)布時間:2024/6/21 综合教程 38 生活家
生活随笔 收集整理的這篇文章主要介紹了 SpringBoot(3)—配置文件详解:Properties和YAML 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、配置文件優(yōu)先級加載機制

  SpringBoot項目啟動會掃描以下位置的application.properties或者application.yml作為默認的配置文件

    1、工程根目錄:./config/

    2、工程根目錄:./

    3、classpath:/config/

    4、classpath:/

  加載的優(yōu)先級順序是從上向下加載,并且所有的文件都會被加載,高優(yōu)先級的內(nèi)容會覆蓋低優(yōu)先級的內(nèi)容,形成互補配置

  PS:不過需要注意的是在工程根路徑下或者根路徑的config下面的配置文件,在工程打包時候不會被打包進去(這也可能和項目級別有關(guān)系,Module級別與IDEA中Project級別的,待驗證,未實操)。  

  我們可以從ConfigFileApplicationListener這類便可看出,其中DEFAULT_SEARCH_LOCATIONS屬性設(shè)置了加載的目錄:

private static final String DEFAULT_SEARCH_LOCATIONS = "classpath:/,classpath:/config/,file:./,file:./config/";

  接著getSearchLocations方法中去逗號解析成Set,其中內(nèi)部類Loader負責(zé)這一配置文件的加載過程,包括加載profile指定環(huán)境的配置,以application+’-’+name格式的拼接加載。

  (1)我們也可以通過制定配置spring.config.location來改變默認配置,一般在項目已經(jīng)打包后,我們可以通過以下指令來加載外部的配置 

java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=D:/application.properties

  (2)另外也可以通過命令行參數(shù)進行配置

    (a)所有的配置都可以在命令行上進行指定

    (b)多個配置用空格分開;--配置項=值

java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar 
--server.port=8087 --server.context-path=/abc

  (3)以下優(yōu)先級從高到低加載順序:

    (a)命令行參數(shù)

    (b)來自java:comp/env的JNDI屬性

    (c)Java系統(tǒng)屬性(System.getProperties())

    (d)操作系統(tǒng)環(huán)境變量

    (e)RandomValuePropertySource配置的random.*屬性值

    (f)jar包外部的application-{profile}.properties或application.yml(帶spring.profile)配置文件

    (g)jar包內(nèi)部的application-{profile}.properties或application.yml(帶spring.profile)配置文件

    (h)jar包外部的application.properties或application.yml(不帶spring.profile)配置文件

    (i)jar包內(nèi)部的application.properties或application.yml(不帶spring.profile)配置文件

      備注:由jar包外想jar包內(nèi)進行尋找,優(yōu)先加載帶profile的,再加載不帶profile的

    (j)@Configuration注解類上的@PropertySource

    (k)通過SpringApplication.setDefaultProperties指定的默認屬性

二、properties配置優(yōu)先級>YAML配置優(yōu)先級

  SpringBoot使用一個以application命名的配置文件作為默認的全局配置文件。支持properties后綴結(jié)尾的配置文件或者以yml/yaml后綴結(jié)尾的YAML的文件配置。
以設(shè)置應(yīng)用端口為例
  properties文件示例(application.properties):

server.port=80

  YAML文件示例(application.yml):

server:
  port: 80

  備注:在同一目錄下,properties配置優(yōu)先級 > YAML配置優(yōu)先級。//所以我們在jar包啟動時帶上properties寫法的配置可以覆蓋配置。

  yml類型的寫法:冒號后要加個空格  

三、@PropertySource和@ImportResource

  通常情況下我們將配置配置在application開頭的主配置文件中,這樣隨著項目的增大配置項的增多會使文件變得非常臃腫,其實SpringBoot早已考慮到了該問題,SpringBoot提供了**@PropertySource和@ImportResource**兩個注解用于加載外部配置文件使用。

@PropertySource通常用于屬性加載配置文件,注意@PropertySource注解不支持加載yaml文件,支持properties文件。
@ImportResource通常用于加載Spring的xml配置文件

  1、@propertySource使用

    (1)裝配properties配置文件

    在sources/config下創(chuàng)建一個yaml文件命名為user.properties內(nèi)容與上方user的配置一樣

    

@PropertySource(value = {"classpath:config/user.properties"})
@Component
@ConfigurationProperties(prefix = "user")
public class Login{
private String username;
private String password;
...
}

    (2)同時加載多個配置問題

  細心的你,會發(fā)現(xiàn)@PropertySource注解中屬性value為一個數(shù)組,如果同時加載多個配置文件,并且不同配置文件中對同一個屬性設(shè)置了不同的值,那么Spring會識別哪一個呢?

帶著疑問,我們可以通過控制變量法進行測試,具體過程再在贅述。

@PropertySource(value = {"classpath:config/user1.properties","classpath:config/user2.properties"})

  結(jié)論:Spring加載順序為從左到右順序加載,后加載的會覆蓋先加載的屬性值。

    (3)配yaml配置文件

  如果你有強迫癥,一定想加載yaml配置文件,那么可以通過PropertySourcesPlaceholderConfigurer類來加載yaml文件,將原來的user.properties改成user.yaml,Bean配置類中加入如下代碼,Login配置類和一開始的方式一致。

@Bean
public static PropertySourcesPlaceholderConfigurer loadProperties() {
    PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
    YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
    //yaml.setResources(new FileSystemResource("classpath:config/user.yml"));//File路徑引入
    yaml.setResources(new ClassPathResource("config/user.yml"));//class路徑引入
    configurer.setProperties(yaml.getObject());
    return configurer;
}

  運行一下,仍然可以能達到加載配置效果的。

  2、@ImportResource使用

  SpringBoot提出零xml的配置,因此SpringBoot默認情況下是不會主動識別項目中Spring的xml配置文件。為了能夠加載xml的配置文件,SpringBoot提供了@ImportResource注解該注解可以加載Spring的xml配置文件,通常加于啟動類上。

@ImportResource(value = {"classpath:/beans.xml"})
@SpringBootApplication(scanBasePackages = {"team.seagull.client"})
public class DeployApplication {
    public static void main(String[] args) {
        SpringApplication.run(DeployApplication.class, args);
    }
}

四、多環(huán)境配置

  1、多環(huán)境配置的好處

    (1)不同環(huán)境配置可以配置不同的參數(shù)

    (2)便于部署,提高效率,減少出錯

  2、properties多環(huán)境配置

    (1)配置激活選項

      spring.profiles.active=dev

    (2)添加其他配置文件

      

  3、YAML多環(huán)境配置

    (1)配置激活選項

spring: 
    profiles: 
        active: dev       

    (2)在配置文件添加三個英文狀態(tài)下的短橫線即可區(qū)分

---
spring: 
    profiles: dev

  4、兩種配置方式的比較

    (1)Properties配置多環(huán)境,需要添加多個配置文件,YAML只需要一個配件文件

    (2)書寫格式的差異,yaml相對比較簡潔,優(yōu)雅

    (3)YAML的缺點:不能通過@PropertySource注解加載。如果需要使用@PropertySource注解的方式加載值,那就要使用properties文件。

  5、如何使用

java -jar myapp.jar --spring.profiles.active=dev

五、一般配置文件方案參考

  我在自己的springboot項目中使用了多個配置文件,

  application.properties是主配置文件,放一些項目通用的配置;

  application-dev.properties 放的是平常開發(fā)的一些配置,比如說數(shù)據(jù)庫的連接地址、帳號密碼等;

  application-prod.properties 放的是生產(chǎn)環(huán)境的一些配置,比如說數(shù)據(jù)庫的連接地址、帳號密碼等。

  當(dāng)然也可以再多一個application-test.properties ,放一些測試環(huán)境需要用到的參數(shù)。

  

  可以通過在application.properties 中設(shè)置spring.profiles.active=prod或者dev來使用application-dev.properties或者application-prod.properties文件,當(dāng)然test文件也是同理。

總結(jié)

以上是生活随笔為你收集整理的SpringBoot(3)—配置文件详解:Properties和YAML的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。