一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術(shù)及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - SpringBoot配置加載,各配置文件優(yōu)先級對比方式

SpringBoot配置加載,各配置文件優(yōu)先級對比方式

2021-12-06 14:32IT_faquir Java教程

這篇文章主要介紹了SpringBoot配置加載,各配置文件優(yōu)先級對比方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

 

1.SpringBoot配置文件

SpringBoot使用一個以application命名的配置文件作為默認的全局配置文件。支持properties后綴結(jié)尾的配置文件或者以yml/yaml后綴結(jié)尾的YAML的文件配置。

 

以設(shè)置應用端口為例

properties文件示例(application.properties):

server.port=80

YAML文件示例(application.yml):

server:
  port: 80

yaml語法規(guī)范這里不多說

兩者同時存在情況

假如各配置文件都配置了不同的端口,那么SpringBoot會使用哪一個端口呢?帶著疑問試驗一下實例

  • 在resources目錄下創(chuàng)建兩個配置文件,一個為application.yml配置文件,設(shè)置端口為8010,另一個為application.properties配置文件,設(shè)置端口為8020;
  • 重啟系統(tǒng);
  • 運行結(jié)果:

SpringBoot配置加載,各配置文件優(yōu)先級對比方式

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

 

2.配置文件目錄

SpringBoot配置文件可以放置在多種路徑下,不同路徑下的配置優(yōu)先級有所不同。可放置目錄(優(yōu)先級從高到低)

  • file:./config/ (當前項目路徑config目錄下);
  • file:./ (當前項目路徑下);
  • classpath:/config/ (類路徑config目錄下);
  • classpath:/ (類路徑config下).

優(yōu)先級由高到底,高優(yōu)先級的配置會覆蓋低優(yōu)先級的配置;

SpringBoot會從這四個位置全部加載配置文件并互補配置;

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

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

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

多種目錄配置同時存在情況

接下來還是以端口配置為例

  • 在resources/目錄下配置文件設(shè)置端口為8888;
  • 在resources/config目錄下配置文件設(shè)置端口為9999;
  • 在項目路徑下配置文件設(shè)置端口為6666;
  • 在項目路徑config目錄下配置文件設(shè)置端口為7777;

SpringBoot配置加載,各配置文件優(yōu)先級對比方式

最終運行結(jié)果:

Tomcat started on port(s): 7777 (http) with context path "/beedo"

Started BeedoApplication in 4.544 seconds (JVM running for 5.335)

通過控制變量法得以論證

其優(yōu)先級由高到底,高優(yōu)先級的配置會覆蓋低優(yōu)先級的配置

 

3.自定義配置屬性

SpringBoot提供了許多的配置,但通常情況我們需要自定義自己的配置應用自己的系統(tǒng)中,如你需要配置一個默認的用戶名密碼做為系統(tǒng)的登錄用。

首先創(chuàng)建一個實體類,作為配置注入用,并使用**@ConfigurationProperties注解進行批量注入, 也可以使用Spring底層注解

@Value("${user.username}")**的方式一個一個注入達到同意的效果

@Component
@ConfigurationProperties(prefix = "user")
public class Login{
    private String username;
    private String password;
    ...
}

或者@Value寫法

@Component
public class Login{    
    private String username;
    private String password;
    ...
}

配置yaml文件

user:
    username: admin
    password: 123

或者properties文件

login.username=admin
login.password=123

編寫一個junit測試用例,看看配置的值是否正常注入:

@RunWith(SpringRunner.class)
@SpringBootTest
public class DeployApplicationTests {
    @Autowired
    private Login login;
    @Test
    public void contextLoads() {
        System.out.println(login);
    }
}

從輸出結(jié)果上看,值已正常注入

Login{username=‘admin", password=‘123"}

比較項 @ConfigurationProperties @Value
全量注入 支持
松散綁定(Relaxed binding) 支持
SpEL 支持
JSR303 支持 不支持

**松散綁定:**駝峰命名(userName)、橫干拼接(user-name)、下劃線(user_name)之間可以互相識別綁定稱為做松散綁定 **JSR303:**通過@Email,@Nullable,@Digits 等等注解進行郵箱、判空、數(shù)字格式等等數(shù)據(jù)的校驗,更多相關(guān)內(nèi)容請參考IBM的中文文檔:https://www.ibm.com/developerworks/cn/java/j-lo-jsr303/index.html @ConfigurationProperties通常用于將配置全量注入某個類中; @Value通常用于注入某一些特定配置值中;

 

自定義配置提示

在編寫配置時,你會發(fā)現(xiàn)自定義配置沒有提示,讓你在使用自定義配置時變的很麻煩,其實SpringBoot早已為我們準備好了提示的需要,只需要用引入相關(guān)依賴即可有提示。

在沒有加入依賴時idea會有如下提示:

SpringBoot配置加載,各配置文件優(yōu)先級對比方式

添加依賴,該idea提示便消失,編寫自定義配置時也有相應提示:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

需要運行一下

 

4.指定配置文件

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

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

 

@PropertySource使用

裝配properties配置文件

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

SpringBoot配置加載,各配置文件優(yōu)先級對比方式

Login類可如下寫法

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

運行一下,同樣能達到加載配置效果

同時加載多個配置問題

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

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

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

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

 

裝配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;
}

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

 

@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);
    }
}

 

其他問題

 

idea使用*.properties文件出現(xiàn)中文亂碼問題?

idea對*.properties默認編碼為GBK,通常我們項目為UTF-8編碼,這樣程序在讀取時就會出現(xiàn)亂碼問題;

 

解決方法:

idea 中 打開如下選項File->Sttings->Editor->FileEncodings

SpringBoot配置加載,各配置文件優(yōu)先級對比方式

將GBK修改為UTF-8并勾選

Transparent native-to ascill conversion(在運行的時候轉(zhuǎn)換成ascii碼)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/IT_faquir/article/details/80869578

延伸 · 閱讀

精彩推薦
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發(fā)項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發(fā)現(xiàn)了對于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關(guān)于Java8中S...

    阿杜7482021-02-04
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經(jīng)有好久沒有升過級了。升級完畢重啟之后,突然發(fā)現(xiàn)好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java實現(xiàn)搶紅包功能

    Java實現(xiàn)搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現(xiàn)搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關(guān)于小米推送Java代碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩(wěn)中求8032021-07-12
  • Java教程xml與Java對象的轉(zhuǎn)換詳解

    xml與Java對象的轉(zhuǎn)換詳解

    這篇文章主要介紹了xml與Java對象的轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
  • Java教程Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
主站蜘蛛池模板: 日本色网址 | 白丝校花被扒开双腿喷水小说 | 日本在线观看免费观看完整版 | 国产免费美女视频 | 视频一区二区国产无限在线观看 | 精品久久久噜噜噜久久久app | 日本精品一区二区三区 | 亚洲欧美国产另类视频 | 精品一区二区免费视频蜜桃网 | 日韩一级片在线播放 | 国产成人精品高清在线观看99 | 朝鲜女人性猛交 | 亚洲国产精品久久网午夜小说 | 日韩亚洲一区中文字幕在线 | 欧美一区二区三区视视频 | 国产精品理论片 | 激情另类国内一区二区视频 | 欧美男同video| 日本三级在丈面前被耍了 | 国产精品思瑞在线观看 | 麻豆最新地址 | 91国在线观看 | 500福利第一巨人导航 | 久久亚洲免费视频 | 久久人妻熟女中文字幕AV蜜芽 | 欧美va免费精品高清在线 | 变态 另类 国产 亚洲 | 国产成人亚洲综合a∨婷婷 国产成人亚洲精品乱码在线观看 | 2020最新版的ab片 | 国产成人一区二区三区在线视频 | 色老板视频在线观看 | h视频免费高清在线观看 | 欧美同性video | 任我淫 | 成人网免费视频 | 日韩人成 | 日韩中文字幕在线不卡 | 亚洲成人影院在线观看 | 美女草b| free chinese麻豆 | 免费理伦片在线观看全网站 |