Spring Boot2 實戰(zhàn)系列之屬性配置

一交惯、前言

在項目中我們常常需要配置一些基本的屬性次泽,比如連接數(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)建項目

1.jpg

項目結構圖如下:


2.jpg

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 上下文泞歉,有幾種方法可以將配置內容注入到屬性中:

    1. 用 @Value 注解注入類屬性中逼侦。
    1. 當你的配置內容較多時匿辩,用 @Value 需要注入多次,可以通過 @ConfigurationProperties 將 properties 與 Java 類 及其屬性相關聯(lián)榛丢。
    1. 當你有一個自定義的配置文件铲球,如 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());
    }
}

四溯饵、測試結果

  1. 訪問 http://localhost:8080/
    3.jpg
  1. 訪問 http://localhost:8080/book
    4.jpg
  1. 訪問 http://localhost:8080/person
    5.jpg

項目已上傳至 Github: https://github.com/yekongle/springboot-code-samples/tree/master/springboot-properties-sample , 希望對小伙伴們有幫助哦。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末锨用,一起剝皮案震驚了整個濱河市丰刊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌增拥,老刑警劉巖啄巧,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異掌栅,居然都是意外死亡秩仆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門猾封,熙熙樓的掌柜王于貴愁眉苦臉地迎上來澄耍,“玉大人,你說我怎么就攤上這事晌缘∑肓” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵磷箕,是天一觀的道長选酗。 經(jīng)常有香客問我,道長岳枷,這世上最難降的妖魔是什么芒填? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮空繁,結果婚禮上殿衰,老公的妹妹穿的比我還像新娘。我一直安慰自己盛泡,他們只是感情好闷祥,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著饭于,像睡著了一般蜀踏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上掰吕,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天果覆,我揣著相機與錄音,去河邊找鬼殖熟。 笑死局待,一個胖子當著我的面吹牛,可吹牛的內容都是我干的菱属。 我是一名探鬼主播钳榨,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼纽门!你這毒婦竟也來了薛耻?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤赏陵,失蹤者是張志新(化名)和其女友劉穎饼齿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蝙搔,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡缕溉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了吃型。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片证鸥。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖勤晚,靈堂內的尸體忽然破棺而出枉层,到底是詐尸還是另有隱情,我是刑警寧澤赐写,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布返干,位于F島的核電站,受9級特大地震影響血淌,放射性物質發(fā)生泄漏矩欠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一悠夯、第九天 我趴在偏房一處隱蔽的房頂上張望癌淮。 院中可真熱鬧,春花似錦沦补、人聲如沸乳蓄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽虚倒。三九已至美侦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間魂奥,已是汗流浹背菠剩。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留耻煤,地道東北人具壮。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像哈蝇,于是被迫代替她去往敵國和親棺妓。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348