Spring Boot 的配置文件 application.properties
1、位置問題
當我們創建一個 Spring Boot 工程時,默認 resources 目錄下就有一個 application.properties 文件,可以在 application.properties 文件中進行項目配置,但是這個文件並非唯一的配置文件,在 Spring Boot 中,一共有 4 個地方可以存放 application.properties 文件。
- 當前項目根目錄下的 config 目錄下
- 當前項目的根目錄下
- resources 目錄下的 config 目錄下
- 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/
2、普通的屬性注入
由於 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 文件。
這只是 Spring 中屬性注入的一個簡單用法,和 Spring Boot 沒有任何關係。
3、類型安全的屬性注入
pring 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 註解挨個注入了,減少工作量並且避免出錯。