SpringBoot讀取外部配置文件的方法

點擊上方「藍字」關注我們

1.SpringBoot配置文件

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

以設置應用端口爲例

properties文件示例(application.properties):

server.port=80

YAML文件示例(application.yml):

server:
  port: 80

在properties和yml/yaml配置文件同時存在的情況下, 在同一目錄下,properties配置優先級 > YAML(YML)配置優先級


2.配置文件目錄

SpringBoot配置文件可以放置在多種路徑下,不同路徑下的配置優先級有所不同。

可放置目錄(優先級從高到低)

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

優先級由高到底,高優先級的配置會覆蓋低優先級的配置;

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

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

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

接着getSearchLocations方法中去逗號解析成Set,其中內部類Loader負責這一配置文件的加載過程,

包括加載profile指定環境的配置,以application+’-’+name格式的拼接加載。

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

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

在resources/目錄下配置文件設置端口爲8888;
在resources/config目錄下配置文件設置端口爲9999;
在項目路徑下配置文件設置端口爲6666;
在項目路徑config目錄下配置文件設置端口爲7777;

]

最終運行結果:

Tomcat started on port(s): 7777 (http) with context path '/beedo'
Started BeedoApplication in 4.544 seconds (JVM running for 5.335)

通過控制變量法得以論證
其優先級由高到底,高優先級的配置會覆蓋低優先級的配置


3.自定義配置屬性

SpringBoot提供了許多的配置,但通常情況我們需要自定義自己的配置應用自己的系統中,如你需要配置一個默認的用戶名密碼做爲系統的登錄用。
首先創建一個實體類,作爲配置注入用,並使用@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;
    ...
}

配置文件寫法

# yml文件寫法
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);
    }
}

從輸出結果上看,值已正常注入
Login{username=‘admin’, password=‘123’}

@ConfigurationProperties與@Value兩種註解對比

比較項@ConfigurationProperties@Value
全量注入支持不支持
鬆散綁定(Relaxed Binding)支持不支持
SpEL不支持支持
JSR303支持不支持
鬆散綁定:駝峯命名(userName)、橫幹拼接(user-name)、下劃線(user_name)之間可以互相識別綁定稱爲做鬆散綁定
JSR303:通過@Email,@Nullable,@Digits 等等註解進行郵箱、判空、數字格式等等數據的校驗,更多相關內容請參考IBM的中文文檔:https://www.ibm.com/developerworks/cn/java/j-lo-jsr303/index.html
@ConfigurationProperties通常用於將配置全量注入某個類中;
@Value通常用於注入某一些特定配置值中;

使用@ConfigurationProperties方式可以進行配置文件與實體字段的自動映射,但需要字段必須提供set方法纔可以,而使用@Value註解修飾的字段不需要提供set方法

自定義配置提示

在編寫配置時,你會發現自定義配置沒有提示,讓你在使用自定義配置時變的很麻煩,其實SpringBoot早已爲我們準備好了提示的需要,只需要用引入相關依賴即可有提示。
在沒有加入依賴時idea會有如下提示:

添加依賴,該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下創建一個yaml文件命名爲user.properties內容與上方user的配置一樣

Login類可如下寫法

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

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

同時加載多個配置問題
細心的你,會發現@PropertySource註解中屬性value爲一個數組,如果同時加載多個配置文件,並且不同配置文件中對同一個屬性設置了不同的值,那麼Spring會識別哪一個呢?
帶着疑問,我們可以通過控制變量法進行測試,具體過程再在贅述。

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

結論: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文件出現中文亂碼問題?
idea對
.properties默認編碼爲GBK,通常我們項目爲UTF-8編碼,這樣程序在讀取時就會出現亂碼問題;
解決方法:idea 中 打開如下選項File->Sttings->Editor->FileEncodings

將GBK修改爲UTF-8並勾選
Transparent native-to ascill conversion(在運行的時候轉換成ascii碼)

http協議無狀態中的 "狀態" 到底指的是什麼?!

用Nginx實現接口慢查詢並可示化展示TOP 20

MySQL 加鎖和死鎖解析

如果是MySQL引起的CPU消耗過大,你會如何優化?

在看”的永遠18歲~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章