一交惯、前言
在項目中我們常常需要配置一些基本的屬性次泽,比如連接數(shù)據(jù)庫的 URL, Driven, username,password 等席爽,這些配置內容如果放在代碼中會變得難以維護, 想象一下意荤,當你的應用配置信息臨時需要變更時,你要改動代碼然后重新編譯打包再部署拳昌,如此一來就耗費大量時間袭异,給用戶帶來不好體驗。因此炬藤,我們通常將配置信息放在一個配置文件中御铃,一般以 .properties 結尾,因為可以直接通過 Properties 類讀取沈矿。
在 Spring Boot 中上真,默認使用一個全局的配置文件 application.properties, 同時也支持 application.yml, 默認放在 src/main/resource 下面, 可以直接將 .properties 改為 .yml, 效果一樣。兩者區(qū)別: properties 的配置是以 key=value 格式存儲內容羹膳,而 yaml 則是以數(shù)據(jù)為中心的語言睡互,配置更加清晰。如下面兩者配置方式對比:
# application.properties
server.port=8090
server.context-path=/hello
# applicaton.yml
server:
port: 8090
contextPath: /hello
日常開發(fā)陵像,我個人習慣用 properties 文件來配置就珠,因此下面使用該格式來進行配置。
二醒颖、創(chuàng)建項目
項目結構圖如下:
pom 依賴文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>top.yekongle</groupId>
<artifactId>springboot-properties-sample</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-properties-sample</name>
<description>Properties sample for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
三妻怎、代碼編寫
SpringBoot 項目啟動后,會從 src/main/resource/ 下的全局配置 application.properties 或 application.yml 配置文件讀取內容并加載到Spring 上下文泞歉,有幾種方法可以將配置內容注入到屬性中:
- 用 @Value 注解注入類屬性中逼侦。
- 當你的配置內容較多時匿辩,用 @Value 需要注入多次,可以通過 @ConfigurationProperties 將 properties 與 Java 類 及其屬性相關聯(lián)榛丢。
- 當你有一個自定義的配置文件铲球,如 test.properties, springboot 默認不會加載,這時你可以通過 @PropertySource 引入這個配置文件晰赞,配合 @Value 和 @ConfigurationProperties 使用稼病。
application.properties(springboot 默認加載)
# Book info
book.author=yekongle
book.name=SpringBoot
# Song info
song.author=Taylor Swift
song.name=Fearless
SongConfig.java
package top.yekongle.properties.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* @Component 將其注冊成 Bean
* @ConfigurationProperties 指定屬性前綴,綁定到類屬性中
* @Data 自動生 getter setter 方法
* */
@Component
@ConfigurationProperties(prefix = "song")
@Data
public class SongConfig {
private String author;
private String name;
}
test.properties(自定義配置文件掖鱼,通過 @PropertySource 引入)
# Person info
person.name=yekongle
person.age=24
PersonConfig.java
package top.yekongle.properties.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
/**
* @Component 將其注冊成 Bean
* @PropertySource 指定類路徑下配置文件
* @ConfigurationProperties 自動生 getter setter 方法
* */
@Component
@PropertySource(value = "classpath:test.properties")
@ConfigurationProperties(prefix = "person")
@Data
public class PersonConfig {
private String name;
private int age;
}
IndexController.java
package top.yekongle.properties.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import top.yekongle.properties.config.PersonConfig;
import top.yekongle.properties.config.SongConfig;
@RestController
public class IndexController {
@Value("${book.author}")
private String bookAuthor;
@Value("${book.name}")
private String bookName;
@Autowired
private SongConfig songConfig;
@Autowired
private PersonConfig personConfig;
// 返回用 @Value 注入的配置內容
@RequestMapping("/")
public String index() {
return String.format("book author[%s], book name[%s]", bookAuthor, bookName);
}
// 返回用 @ConfigurationProperties 注入的配置內容
@RequestMapping("/song")
public String song() {
return String.format("song author[%s], song name[%s]", songConfig.getAuthor(), songConfig.getName());
}
// 返回用 @PropertySource與ConfigurationProperties組合使用注入的配置內容
@RequestMapping("/person")
public String person() {
return String.format("person name[%s], person age[%d]", personConfig.getName(), personConfig.getAge());
}
}
四溯饵、測試結果
項目已上傳至 Github: https://github.com/yekongle/springboot-code-samples/tree/master/springboot-properties-sample , 希望對小伙伴們有幫助哦。