首頁 > 軟體

一篇文章輕鬆瞭解SpringBoot設定高階

2022-11-09 14:02:21

前言

本文介紹的是SpringBoot設定高階部分,課程是跟著黑馬走的,所以會有一些借鑑,當然也是筆記,還會參考一些大佬的分享;這裡的SpringBoot設定高階,並不是SpringBoot所有的高階設定;SpringBoot體系(或者說Spring)是十分龐大的,筆者也自知不能窮盡,故而只能把所學的東西拿來記一記,練一練。文章內容如若有誤,還請大家批評指正。

@ConfigurationProperties

@ConfigurationProperties告訴SpringBoot將本類中的所有屬性和組態檔中相關的設定進行繫結;要進行繫結,首先這個類要受Spring管理,spring才能操作裡面的資料。

使用場景

場景一:使用@ConfigurationProperties和@Component註解到bean定義類上.

注意,這裡是到bean定義類上,這裡的bean指的是受Spring管理的bean,而@Component註解就是把一個類當成一個bean註冊到Spring容器中。

自定義一個組態檔:

book:
  bookName: Spring技術內幕
  price: 36.57

定義一個bean:

package com.example.entity;

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

package com.example.entity;

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

/**
 * @author 不止於夢想
 * @date 2022/11/7 18:50
 */
@Component//交給Spring容器管理
@ConfigurationProperties(prefix = "book")//載入組態檔,設定字首表示式
@Data
public class Book {
    //書名
    private String bookName;
    //價格
    private double price;
}

注意看,此時是有@Component註解的,說明這個bean受Spring容器管理。

測試:

package com.example.springbootconfigureadvanced;

import com.example.entity.Book;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class SpringBootConfigureAdvancedApplicationTests {
    @Autowired
    Book book;
    @Test
    void contextLoads() {
    }
    @Test
    public void toTest(){
        System.out.println(book.getPrice());
    }
}

結果:

此時如果把@component去掉:

直接爆紅了,語法都不給你通過,這說明了要@ConfigurationProperties生效,被注入的bean應該要受Spring管理或者說在Spring容器中。

場景二:使用@ConfigurationProperties和@Bean註解在設定類的Bean定義方法上

解釋一下:如果我們使用註解開發,一般會把第三方技術寫成一個設定類,然後使用@ConfigurationProperties和@Bean註解對其進行注入,從而實現對第三方屬性的繫結。

注意這裡的兩個註解使用在方法上,但是要繫結,這個類必須得讓Spring管理,所以需要一個註解來顯示這個類,讓Spring能夠掃描到,以便與可以把其新增到容器中。

新建一個設定類:

package com.example.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author 不止於夢想
 * @date 2022/11/7 19:51
 */
@Configuration//宣告一個類為設定類,用於取代bean.xml組態檔註冊bean物件。
public class MyConfig {

    @ConfigurationProperties(prefix = "datasource")
    @Bean
    public DruidDataSource dataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        return dataSource;
    }
}

新增設定:

dataSource:
  url: jdbc:mysql://127.0.0.1:3306/springBoot?serverTimezone=UTC

注意這裡並沒有用spring.dataSource格式,如果是那樣,倒不如直接在組態檔配好,瞎整設定類幹啥。

測試:

package com.example;

import com.alibaba.druid.pool.DruidDataSource;
import com.example.entity.Book;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class SpringBootConfigureAdvancedApplication {

    public static void main(String[] args) {
        //獲取應用上下文設定
        ConfigurableApplicationContext context = SpringApplication.run(
                SpringBootConfigureAdvancedApplication.class, args);
        DruidDataSource dataSource = context.getBean(DruidDataSource.class);
        System.out.println(dataSource.getUrl());
    }
}

這裡我們直接在SpringBoot應用類獲取應用上下文設定即可獲取容器中的bean,不用再費勁去測試類整一堆東西;

驗證:

解釋一下,不然不清楚:在上面設定類MyConfig中設定了一個方法,返回值就是資料來源物件,就是說使用方法建立了資料來源物件,然後使用@Bean把這個方法定義為一個受Spring管理的bean,再使用@ConfigurationProperties(prefix = “datasource”)載入組態檔進入資料來源物件,但是這樣還不夠,這個類Spring並不能掃描到,所以使用@Configuration把這個類定義為設定類,這樣就可以載入這個類。

在這裡沒有的組態檔中的dataSource只是一個普通的設定。

場景三:使用@ConfigurationProperties註解到普通類,然後再通過@EnableConfigurationProperties定義為Bean。

先說一下@EnableConfigurationProperties的用法:這個註解相當於一個開關,用來開啟設定的繫結,使用這個註解,不用把類手動交給Spring載入成bean,直接在這個註解後面加上你要開啟設定的類的類名.class即可,這個註解會告訴Spring把類載入成bean,並放入容器中。

說白了就是讓@ConfigurationProperties生效。

還是上面的例子:

沒加@EnableConfigurationProperties、也沒有加其他製成bean的註解:

加上@EnableConfigurationProperties

測試:

小結

1、注意三種使用情況,特別是第三種,在後面的原理篇會大量出現

2、@EnableConfigurationProperties是一個開關,用來開啟被@ConfigurationProperties註解註釋而沒有其他生成bean註解的類與組態檔注入的開關。

寬鬆繫結/鬆散繫結

@ConfigurationProperties繫結屬性支援屬性名寬鬆繫結

總的概況就是,只要組態檔的設定的字母數量和字母與被繫結的bean的prefix(字首)相同都可以繫結,但是注意,prefix的內容全部為小寫。組態檔可以出現大小寫不一致,甚至可以出現各種符號(非abcd這些)。

繫結字首名命名規範:僅能使用純小寫字母、數位、下劃線作為合法的字元

舉例:組態檔

dataSource:
  url: jdbc:mysql://127.0.0.1:3306/springBoot?serverTimezone=UTC

類中:

可以看到,雖然這裡的字首和組態檔完全相同,但是還是不正確的,prefix必須全為小寫。

說完了嗎?說完了,其他的試一下就可以,一通百通。

啊,還有就是:

寬鬆繫結不支援註解@Value參照單個屬性的方式

總結

到此這篇關於SpringBoot設定高階的文章就介紹到這了,更多相關SpringBoot設定高階內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com