SpringBoot配置文件 application.properties,yaml配置



部分內容原文地址:

江南一點雨:是時候徹底搞清楚 Spring Boot 的配置文件 application.properties 了!
江南一點雨:Spring Boot中的yaml配置簡介



1.Spring Boot 的配置文件 application.properties

在 Spring Boot 中,配置文件有兩種不同的格式,一個是 properties ,另一個是 yaml 。

yaml 中的數據是有序的,properties 中的數據是無序的,在一些需要路徑匹配的配置中,順序就顯得尤爲重要(例如我們在 Spring Cloud Zuul 中的配置),此時我們一般採用 yaml。

1.1 位置問題

當我們創建一個 Spring Boot 工程時,默認 resources 目錄下就有一個 application.properties 文件,可以在 application.properties 文件中進行項目配置,但是這個文件並非唯一的配置文件,在 Spring Boot 中,一共有 4 個地方可以存放 application.properties 文件。

  1. 當前項目根目錄下的 config 目錄下
  2. 當前項目的根目錄下
  3. resources 目錄下的 config 目錄下
  4. resources 目錄下

按如上順序,四個配置文件的優先級依次降低。如下:
在這裏插入圖片描述
這四個位置是默認位置,即 Spring Boot 啓動,默認會從這四個位置按順序去查找相關屬性並加載。

也可以在項目啓動時自定義配置文件位置。
例如,現在在 resources 目錄下創建一個 javaboy 目錄,目錄中存放一個 application.properties 文件,那麼正常情況下,當我們啓動 Spring Boot 項目時,這個配置文件是不會被自動加載的。我們可以通過 spring.config.location 屬性來手動的指定配置文件位置,指定完成後,系統就會自動去指定目錄下查找 application.properties 文件。

在這裏插入圖片描述
此時啓動項目,就會發現,項目以 classpath:/javaboy/application.propertie 配置文件啓動。

這是在開發工具中配置了啓動位置,如果項目已經打包成 jar ,在啓動命令中加入位置參數即可:

java -jar properties-0.0.1-SNAPSHOT.jar --spring.config.location=classpath:/javaboy/

1.2 文件名問題

對於 application.properties 而言,它不一定非要叫 application ,但是項目默認是去加載名爲 application 的配置文件,如果我們的配置文件不叫 application ,也是可以的,但是,需要明確指定配置文件的文件名。

方式和指定路徑一致,只不過此時的 key 是 spring.config.name 。

首先我們在 resources 目錄下創建一個 app.properties 文件,然後在 IDEA 中指定配置文件的文件名:
在這裏插入圖片描述
指定完配置文件名之後,再次啓動項目,此時系統會自動去默認的四個位置下面分別查找名爲 app.properties 的配置文件。當然,允許自定義文件名的配置文件不放在四個默認位置,而是放在自定義目錄下,此時就需要明確指定 spring.config.location 。

配置文件位置和文件名稱可以同時自定義。

1.3 普通的屬性注入

由於 Spring Boot 源自 Spring ,所以 Spring 中存在的屬性注入,在 Spring Boot 中一樣也存在。由於 Spring Boot 中,默認會自動加載 application.properties 文件,所以簡單的屬性注入可以直接在這個配置文件中寫。

例如,現在定義一個 Book 類:

public class Book {
    private Long id;
    private String name;
    private String author;
    //省略 getter/setter
}

然後,在 application.properties 文件中定義屬性:

book.name=三國演義
book.author=羅貫中
book.id=1

按照傳統的方式(Spring中的方式),可以直接通過 @Value 註解將這些屬性注入到 Book 對象中:

@Component
public class Book {
    @Value("${book.id}")
    private Long id;
    @Value("${book.name}")
    private String name;
    @Value("${book.author}")
    private String author;
    //省略getter/setter
}

注意:
Book 對象本身也要交給 Spring 容器去管理,如果 Book 沒有交給 Spring 容器,那麼 Book 中的屬性也無法從 Spring 容器中獲取到值。

配置完成後,在 Controller 或者單元測試中注入 Book 對象,啓動項目,就可以看到屬性已經注入到對象中了。

一般來說,我們在 application.properties 文件中主要存放系統配置,這種自定義配置不建議放在該文件中,可以自定義 properties 文件來存在自定義配置。

例如在 resources 目錄下,自定義 book.properties 文件,內容如下:

book.name=三國演義
book.author=羅貫中
book.id=1

此時,項目啓動並不會自動的加載該配置文件,如果是在 XML 配置中,可以通過如下方式引用該 properties 文件:

<context:property-placeholder location="classpath:book.properties"/>

如果是在 Java 配置中,可以通過 @PropertySource 來引入配置:

@Component
@PropertySource("classpath:book.properties")
public class Book {
    @Value("${book.id}")
    private Long id;
    @Value("${book.name}")
    private String name;
    @Value("${book.author}")
    private String author;
    //getter/setter
}

這樣,當項目啓動時,就會自動加載 book.properties 文件。

1.4 類型安全的屬性注入

Spring Boot 引入了類型安全的屬性注入,如果採用 Spring 中的配置方式,當配置的屬性非常多的時候,工作量就很大了,而且容易出錯。

使用類型安全的屬性注入,可以有效的解決這個問題。

@Component
@PropertySource("classpath:book.properties")
@ConfigurationProperties(prefix = "book")
public class Book {
    private Long id;
    private String name;
    private String author;
    //省略getter/setter
}

這裏,主要是引入 @ConfigurationProperties(prefix = “book”) 註解,並且配置了屬性的前綴,此時會自動將 Spring 容器中對應的數據注入到對象對應的屬性中,就不用通過 @Value 註解挨個注入了,減少工作量並且避免出錯。

2.Spring Boot中的yaml配置簡介

spring.config.location屬性,另一個則是使用 spring.config.additional-location這個屬性,在第一個屬性中,表示自己重新定義配置文件的位置,項目啓動時就按照定義的位置去查找配置文件,這種定義方式會覆蓋掉默認的四個位置,也可以使用第二種方式,第二種方式則表示在四個位置的基礎上,再添加幾個位置,新添加的位置的優先級大於原本的位置。

配置方式如下:
在這裏插入圖片描述
配置文件位置時,值一定要以/結尾。

2.1 數組注入

yaml也支持數組注入,例如:

my:
	servers:
		- dev.example.com
		- another.example.com

這段數據可以綁定到一個帶Bean的數組中:

@ConfigurationProperties(prefix="my")
@Component
public class Config {
	private List<String> servers = new ArrayList<String>();
	
	public List<String> getServers{
		return this.servers;
	}
}

項目啓動後,配置中的數組會自動存儲到servers集合中。當然,yaml不僅可以存儲這種簡單數據,也可以在集合中存儲對象。例如下面這種:

redis:
	redisConfigs:
		- host: 192.168.1.1
		  port: 6379
		- host: 192.168.1.2
		  port: 6380

注入到如下類中:

@Component
@ConfigurationProperties(prefix="redis")
public class RedisCluster{
	private List<SingleRedisConfig>  redisConfigs;

	//setter,getter
}
發佈了399 篇原創文章 · 獲贊 225 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章