一起來學(xué)SpringBoot | 第二篇:SpringBoot配置詳解

SpringBoot 是為了簡化 Spring 應(yīng)用的創(chuàng)建、運(yùn)行、調(diào)試、部署等一系列問題而誕生的產(chǎn)物,自動裝配的特性讓我們可以更好的關(guān)注業(yè)務(wù)本身而不是外部的XML配置,我們只需遵循規(guī)范,引入相關(guān)的依賴就可以輕易的搭建出一個 WEB 工程

上一篇介紹了 SpringBoot 由來及構(gòu)建方式,通過第一章的教程我們對 SpringBoot 不在感到陌生,可以發(fā)現(xiàn) SpringBoot 雖然干掉了 XML 但未做到 零配置,它體現(xiàn)出了一種 約定優(yōu)于配置,也稱作按約定編程,是一種軟件設(shè)計(jì)范式,旨在減少軟件開發(fā)人員需做決定的數(shù)量,獲得簡單的好處,而又不失靈活性。 一般情況下默認(rèn)的配置足夠滿足日常開發(fā)所需,但在特殊的情況下,我們往往需要用到自定義屬性配置、自定義文件配置、多環(huán)境配置、外部命令引導(dǎo)等一系列功能。不用擔(dān)心,這些 SpringBoot 都替我們考慮好了,我們只需要遵循它的規(guī)則配置即可

準(zhǔn)備前提

為了讓 Spring Boot 更好的生成配置元數(shù)據(jù)文件,我們需要添加如下依賴(該依賴可以不添加,但是在 IDEA 和 STS 中不會有屬性提示,沒有提示的配置就跟你用記事本寫代碼一樣苦逼,出個問題弄哭你去),該依賴只會在編譯時調(diào)用,所以不用擔(dān)心會對生產(chǎn)造成影響…

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

自定義屬性配置
在 application.properties 寫入如下配置內(nèi)容

my1.age=22
my1.name=Janson

其次定義 MyProperties1.java 文件,用來映射我們在 application.properties 中的內(nèi)容,這樣一來我們就可以通過操作對象的方式來獲得配置文件的內(nèi)容了

package com.hjs.springboottest.properties;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "my1")
@Data
public class MyProperties1 {

    private int age;
    private String name;


    @Override
    public String toString() {
        return "MyProperties1{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

接下來就是定義我們的 PropertiesController 用來注入 MyProperties1 測試我們編寫的代碼,值得注意的是 Spring4.x 以后,推薦使用構(gòu)造函數(shù)的形式注入屬性…


@RequestMapping("/properties")
@RestController
public class PropertiesController {

    private static final Logger log = LoggerFactory.getLogger(PropertiesController.class);

    private final MyProperties1 myProperties1;

    private final MyProperties2 myProperties2;

    @Autowired
    public PropertiesController(MyProperties1 myProperties1,MyProperties2 myProperties2) {
        this.myProperties1 = myProperties1;
        this.myProperties2 = myProperties2;
    }

    @GetMapping("/test")
    public MyProperties1 myProperties1() {
        log.info("=================================================================================================");
        log.info(myProperties1.toString());
        log.info("=================================================================================================");
        return myProperties1;
    }
}

打開瀏覽器,輸入如下地址: http://localhost:9091/properties/test,觀察控制臺,監(jiān)聽到如下內(nèi)容則表示程序正確

2019-01-29 15:12:24.059  INFO 2368 --- [nio-9091-exec-5] c.h.s.controller.PropertiesController    : =================================================================================================
2019-01-29 15:12:24.059  INFO 2368 --- [nio-9091-exec-5] c.h.s.controller.PropertiesController    : MyProperties1{age=21, name='Janson'}
2019-01-29 15:12:24.059  INFO 2368 --- [nio-9091-exec-5] c.h.s.controller.PropertiesController    : =================================================================================================

自定義文件配置
定義一個名為 my2.properties 的資源文件,自定義配置文件的命名不強(qiáng)制 application 開頭

my2.age=22
my2.name=Janson
my2.email=1091796806@qq.com

其次定義 MyProperties2.java 文件,用來映射我們在 my2.properties 中的內(nèi)容。


@Component
@PropertySource("classpath:my2.properties")
@ConfigurationProperties(prefix = "my2")
@Data
@ToString
public class MyProperties2 {
   private int age;
   private String name;
   private String email;

}

接下來在 PropertiesController 用來注入 MyProperties2 測試我們編寫的代碼

    @GetMapping("/test2")
    public MyProperties2 myProperties2() {
        log.info("=================================================================================================");
        log.info(myProperties2.toString());
        log.info("=================================================================================================");
        return myProperties2;
    }

打開瀏覽器,輸入如下地址: http://localhost:9091/properties/test2,觀察控制臺,監(jiān)聽到如下內(nèi)容則表示程序正確

2019-01-29 15:19:32.078  INFO 2368 --- [nio-9091-exec-2] c.h.s.controller.PropertiesController    : =================================================================================================
2019-01-29 15:19:32.078  INFO 2368 --- [nio-9091-exec-2] c.h.s.controller.PropertiesController    : MyProperties2(age=22, name=Janson, email=1091796806@qq.com)
2019-01-29 15:19:32.078  INFO 2368 --- [nio-9091-exec-2] c.h.s.controller.PropertiesController    : =================================================================================================

但是一般來說,我們喜歡采用注解的方式去注入配置。
如在controller里面加入:

    @Value("${my1.age}")
    private  String age;

    @GetMapping("/test3")
    public String myProperties3() {
        log.info("=================================================================================================");
        log.info(age);
        log.info("=================================================================================================");
        return age;
    }

運(yùn)行項(xiàng)目,訪問http://localhost:9091/properties/test3,控制臺打印如下則代表正確:

2019-01-29 16:40:14.627  INFO 11416 --- [nio-9091-exec-6] c.h.s.controller.PropertiesController    : =================================================================================================
2019-01-29 16:40:14.627  INFO 11416 --- [nio-9091-exec-6] c.h.s.controller.PropertiesController    : 21
2019-01-29 16:40:14.628  INFO 11416 --- [nio-9091-exec-6] c.h.s.controller.PropertiesController    : =================================================================================================

多環(huán)境化配置

在真實(shí)的應(yīng)用中,常常會有多個環(huán)境(如:開發(fā),測試,生產(chǎn)等),不同的環(huán)境數(shù)據(jù)庫連接都不一樣,這個時候就需要用到spring.profile.active 的強(qiáng)大功能了,它的格式為 application-{profile}.properties,這里的 application 為前綴不能改,{profile} 是我們自己定義的。

創(chuàng)建 application-dev.properties、application-test.properties、application-prod.properties,內(nèi)容分別如下

application-dev.properties

server.servlet.context-path=/dev 

application-test.properties

server.servlet.context-path=/test

application-prod.properties

server.servlet.context-path=/prod

application.properties 配置文件中寫入 spring.profiles.active=dev,這個時候我們在次訪問 http://localhost:9091/properties/test 就沒用處了,因?yàn)槲覀冊O(shè)置了它的context-path=/dev,所以新的路徑就是 http://localhost:9091/dev/properties/test由此可以看出來我們激活不同的配置讀取的屬性值是不一樣的

外部命令引導(dǎo)

前面三種方式都是基于配置文件層面的,那么有沒有辦法外部引導(dǎo)呢,假設(shè)這樣的場景,我們對已經(jīng)開發(fā)完成的代碼打包發(fā)布,期間在測試環(huán)境測試通過了,那么即可發(fā)布上生產(chǎn),這個時候是修改application.properties的配置方便還是直接在命令參數(shù)配置方便呢,毫無疑問是后者更有說服力。默認(rèn)情況下,SpringApplication 會將命令行選項(xiàng)參數(shù)(即:–property,如–server.port=9000)添加到Environment,命令行屬性始終優(yōu)先于其他屬性源。

如何測試?

  • 進(jìn)入到項(xiàng)目目錄,此處以我本地目錄為主:E:\projects\springboot-test
  • 然后打開 cmd 程序,不會在當(dāng)前目錄打開 cmd 的請自行百度,輸入:mvn package
  • 打包完畢后進(jìn)入到:E:\projects\springboot-test/target 目錄中去,我們可以發(fā)現(xiàn)一個名為springboot-test-0.0.1-SNAPSHOT 的包
  • 接著在打開 cmd 程序,輸入:java -jar springboot-test-0.0.1-SNAPSHOT.jar --spring.profiles.active=test --my1.age=32。仔細(xì)觀察spring.profiles.active=test、my1.age=21 這倆配置的鍵值是不是似曾相識(不認(rèn)識的請從開頭認(rèn)真閱讀)
  • 最后輸入測試地址:http://localhost:9091/test/properties/test 我們可以發(fā)現(xiàn)返回的JSON變成了 {"age":32,"name":"Janson"}表示正確

總結(jié)

掌握@ConfigurationProperties、@PropertySource 等注解的用法及作用
掌握編寫自定義配置
掌握外部命令引導(dǎo)配置的方式

目前很多大佬都寫過關(guān)于 SpringBoot 的教程了,如有雷同,請多多包涵,本教程基于最新的 spring-boot-starter-parent:v2.1.2編寫,包括新版本的特性都會一起介紹…

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容