溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

SpringBoot中怎么使用@ConfigurationProperties

發(fā)布時間:2023-01-12 09:38:22 來源:億速云 閱讀:119 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“SpringBoot中怎么使用@ConfigurationProperties”的相關(guān)知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“SpringBoot中怎么使用@ConfigurationProperties”文章能幫助大家解決問題。

    @ConfigurationProperties

    @ConfigurationProperties告訴SpringBoot將本類中的所有屬性和配置文件中相關(guān)的配置進行綁定;要進行綁定,首先這個類要受Spring管理,spring才能操作里面的數(shù)據(jù)。

    使用場景

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

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

    自定義一個配置文件:

    book:
      bookName: Spring技術(shù)內(nèi)幕
      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")//加載配置文件,配置前綴表達(dá)式
    @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());
        }
    }

    結(jié)果:

    SpringBoot中怎么使用@ConfigurationProperties

    此時如果把@component去掉:

    SpringBoot中怎么使用@ConfigurationProperties

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

    場景二:使用@ConfigurationProperties和@Bean注解在配置類的Bean定義方法上

    解釋一下:如果我們使用注解開發(fā),一般會把第三方技術(shù)寫成一個配置類,然后使用@ConfigurationProperties和@Bean注解對其進行注入,從而實現(xiàn)對第三方屬性的綁定。

    注意這里的兩個注解使用在方法上,但是要綁定,這個類必須得讓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) {
            //獲取應(yīng)用上下文配置
            ConfigurableApplicationContext context = SpringApplication.run(
                    SpringBootConfigureAdvancedApplication.class, args);
            DruidDataSource dataSource = context.getBean(DruidDataSource.class);
            System.out.println(dataSource.getUrl());
        }
    }

    這里我們直接在SpringBoot應(yīng)用類獲取應(yīng)用上下文配置即可獲取容器中的bean,不用再費勁去測試類整一堆東西;

    驗證:

    SpringBoot中怎么使用@ConfigurationProperties

    解釋一下,不然不清楚:在上面配置類MyConfig中設(shè)置了一個方法,返回值就是數(shù)據(jù)源對象,就是說使用方法創(chuàng)建了數(shù)據(jù)源對象,然后使用@Bean把這個方法定義為一個受Spring管理的bean,再使用@ConfigurationProperties(prefix = “datasource”)加載配置文件進入數(shù)據(jù)源對象,但是這樣還不夠,這個類Spring并不能掃描到,所以使用@Configuration把這個類定義為配置類,這樣就可以加載這個類。

    在這里沒有的配置文件中的dataSource只是一個普通的配置。

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

    先說一下@EnableConfigurationProperties的用法:這個注解相當(dāng)于一個開關(guān),用來開啟配置的綁定,使用這個注解,不用把類手動交給Spring加載成bean,直接在這個注解后面加上你要開啟配置的類的類名.class即可,這個注解會告訴Spring把類加載成bean,并放入容器中。

    說白了就是讓@ConfigurationProperties生效。

    還是上面的例子:

    沒加@EnableConfigurationProperties、也沒有加其他制成bean的注解:

    SpringBoot中怎么使用@ConfigurationProperties

    加上@EnableConfigurationProperties

    測試:

    SpringBoot中怎么使用@ConfigurationProperties

    小結(jié)

    1、注意三種使用情況,特別是第三種,在后面的原理篇會大量出現(xiàn)

    2、@EnableConfigurationProperties是一個開關(guān),用來開啟被@ConfigurationProperties注解注釋而沒有其他生成bean注解的類與配置文件注入的開關(guān)。

    寬松綁定/松散綁定

    @ConfigurationProperties綁定屬性支持屬性名寬松綁定

    總的概況就是,只要配置文件的配置的字母數(shù)量和字母與被綁定的bean的prefix(前綴)相同都可以綁定,但是注意,prefix的內(nèi)容全部為小寫。配置文件可以出現(xiàn)大小寫不一致,甚至可以出現(xiàn)各種符號(非abcd這些)。

    綁定前綴名命名規(guī)范:僅能使用純小寫字母、數(shù)字、下劃線作為合法的字符

    舉例:配置文件

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

    類中:

    SpringBoot中怎么使用@ConfigurationProperties

    可以看到,雖然這里的前綴和配置文件完全相同,但是還是不正確的,prefix必須全為小寫。

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

    啊,還有就是:

    寬松綁定不支持注解@Value引用單個屬性的方式

    關(guān)于“SpringBoot中怎么使用@ConfigurationProperties”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI