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

前言

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

環境搭建

我們採用上篇博客簡單spring initializr方式創建springboot項目,可參考 //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自定義配置、多環境配置,這些都是需要我們掌握的基本技能。

Tags: