【SpringBoot實戰】核心配置和註解

airl發表於2022-04-01

前言

SpringBoot核心配置在springboot中有非常重要的作用,我們可是使用核心配置檔案進行一些基礎功能的定義,屬性值的注入等。springboot支援兩種格式的核心配置檔案,一種是properties和yaml,properties採用傳統的鍵值對方式,但是相比於yaml優先順序更高,yaml採用採用樹狀結構,使用縮排進行關係判斷。
註解可以說是springboot的一大特點,採用註解極大的簡化了spring的配置問題。

環境搭建

我們採用上篇部落格簡單spring initializr方式建立springboot專案,可參考 https://www.cnblogs.com/hjk-airl/p/16081134.html

application.properties和application.yaml

application.properties和application.yaml作用是一樣的,對於不同的人群有不一樣的偏好,可採用不同的方式,看個人喜好。

  • 我們在resources資料夾下建立一個application.yaml檔案,方便同時對別兩種方式的不同,因為我們在建立專案的時候application.properties已經建立,所以只需要建立yaml就行。
  • 步驟(右鍵resources->new->file->輸入application.yaml)一定要是這個檔名,不然springboot不識別,建立完成後可以看到這個檔案的圖示和application.properties檔案一樣。

springBoot基本系統屬性配置

我們先修改一下埠號看一下,我們知道預設的埠號是8080,我們修改為8081然後執行。

server.port=8081

image

在這值得注意的是當我們同時存在application.properties和application.yaml時,並且兩者都有內容時,會優先使用properties檔案,我們在application.properties檔案內容刪除或者註釋掉在application.yaml裡輸入

server:
  port: 8082

我們可以在配置檔案裡配置一些基本資訊如jdbc的環境變數,和開啟鬆散繫結,開啟什麼什麼快取的配置等。

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    password: 123456
    username: root

我們還可以配置一些自己類的屬性。
我們建立一個Person類,我們在加@ConfigurationProperties時idea可能會爆紅,但是對程式影響,我們可以先在pom.xml里加一個依賴,如果還爆紅那就把idea關閉在重新開啟。

	<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
        </dependency>
package com.hjk.springboot01.pojo;

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

@Component //將Person類作為Bean注入Sprng容器
@ConfigurationProperties(prefix = "person")
public class Person {
    private String name;
    private String address;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

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

然後在編輯controller類

package com.hjk.springboot01.controller;

import com.hjk.springboot01.pojo.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class PersonController {

    @Autowired
    public Person person;

    @GetMapping("/person")
    public String getPerson(){
        System.out.println(person.toString());
        return person.toString();
    }

}

最後我們在核心配置檔案application.properties或者application.yaml裡編寫想要配置的東西,我沒配置Person的屬性。
application.properties

person.name='hjk'
person.address='中國'

application.yaml
還是那個問題,如果你同時存在properties和yaml檔案,並且兩者都有同種屬性,那麼會優先使用properties裡面的。

person:
  name: hjk
  address: hahaha

最後我們訪問當本地url可以在控制檯看到輸出。
對比兩種注入方式

對比點 @Configuration @Value
底層框架 springboot spring
功能 批量注入配置檔案屬性 單個注入
setter方法 需要 不需要
複製型別注入 支援 不支援
鬆散繫結 支援 不支援
JSR303資料校驗 支援 不支援
SpEL表示式 不支援 支援

自定義配置

如果使用@PropertySource和@Configuration註解實現,@PropertySource註解可以指定自定義配置檔案的名稱,@Configuration註解可以將實現類指定為自定義配置類,如果需要將自定義配置檔案中的屬性值注入實體類屬性,可以使@ConfigurationProperties或@Value注入屬性值

  • 自定義配置檔案,我們建立檔案My.properties
    並且在裡面輸入
my.name=hjk
my.address=hehehe

修改Person類

package com.hjk.springboot01.pojo;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@PropertySource("classpath:My.properties")
@EnableConfigurationProperties(Person.class)
@ConfigurationProperties(prefix = "my")
public class Person {
    private String name;
    private String address;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}
@Configuration 表示自定義配置類,這個類會作為bean元件新增到spring容器種
@PropertySource 指定自定義配置檔案的位置和名稱
@ConfigurationProperties 將配置類中以指定開頭的屬性值注入配置類屬性
@EnableConfigurationProperties 開啟配置的屬性注入功能,配合@ConfigurationProperties使用

使用Profile進行多環境配置

在實際開發中,應用程式通常需要部署到不同的環境中,比如開發環境、測試環境、生產環境。不同的環境可能需要不同的配置,針對這種情況,顯然手動修改配置檔案適應不同開發環境很不現實,這樣我們就可以使用專案的多環境配置。

使用Profile進行多環境配置

使用Profile進行多環境配置命名必須是固定格式。

application-dev.properties
application-test.properties
application-prod.properties

如果想使用上述對應環境的配置檔案,需要在全域性配置檔案裡開啟指定的配置檔案即可。
有兩種方式:
第一種:在控制檯輸入

java -jar xxx.jar --spring.profiles.active=dev

第二種:在application.properties或者yaml中開啟

spring.profiles.active=dev

  • 使用註解@Profile進行多環境配置,這裡就不寫了。

總結

主要記錄了springboot的核心配置和相關注解,包括全域性配置使用,配置檔案屬性值的注入、springboot自定義配置、多環境配置,這些都是需要我們掌握的基本技能。

相關文章