最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot中@ConfigurationProperties 配置綁定

 更新時(shí)間:2021年11月15日 09:55:48   作者:yasinawolaopo  
本文主要介紹了SpringBoot中@ConfigurationProperties 配置綁定,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

SpringBoot底層的一個(gè)功能 : @ConfigurationProperties

@ConfigurationProperties 配置綁定

來舉一個(gè)場(chǎng)景例子 :

我們習(xí)慣于把經(jīng)常變化的一個(gè)東西配到配置文件里面。比如把數(shù)據(jù)庫的一些鏈接地址、賬號(hào)、密碼包括數(shù)據(jù)庫連接池的大小等等這些屬性配到properties配置文件里面,然后為了方便 , 因?yàn)槲覀兾磥砜赡芤獎(jiǎng)?chuàng)建數(shù)據(jù)庫連接池,我們會(huì)把這個(gè)配置文件里面的內(nèi)容又一一解析到我們數(shù)據(jù)庫連接池(比如javaBean我們這個(gè)對(duì)象里面),所以我們這個(gè)實(shí)現(xiàn)場(chǎng)景就是把properties里面的所有配置綁定JavaBean里面。那我們這個(gè)綁定過程如果用java原生代碼來做還是挺麻煩的大概過程:

public class getProperties {
    public static void main(String[] args){
        Properties pps = new Properties();
        pps.load(new FileInputStream("a.properties"));
        Enumeration enum1 = pps.propertyNames();//得到配置文件的名字
        while(enum1.hasMoreElements()){
            String strKey = (String) enum1.nextElement();
            String strValue = pps.getProperty(strKey);
            System.out.println(strKey + "=" + strValue);
            //封裝到JavaBean。
        }
    }
}

我們使用Properties這個(gè)類我們加載來我們這個(gè)配置文件(pps.load(new FileInputStream("a.properties"));)然后遍歷(while(enum1.hasMoreElements()))配置文件的每一個(gè)kv(key-value)值(String strKey = (String) enum1.nextElement(); String strValue = pps.getProperty(strKey););然后把kv值一一對(duì)應(yīng)封裝到JavaBean指定的屬性里

其實(shí)這樣還算簡(jiǎn)單的,復(fù)雜一點(diǎn)的就是:假設(shè)我給你個(gè)你的這個(gè)配置文件(application.properties)這個(gè)文件里面亂七八槽配置了100多行的配置,我讓你在這100多行里面找數(shù)據(jù)與庫有關(guān)的這四五行,那你可能會(huì)使用到正則表達(dá)式等等一大堆的東西你才能把它解析完成,但在SpringBoot里面,這個(gè)過程就會(huì)變得非常簡(jiǎn)單,我們把這個(gè)過程稱為配置綁定;我們只需要一個(gè)注解@ConfigurationProperties

我在這舉了個(gè)例子:

我在這寫了一個(gè)Car.java的類

package com.chentianyu.boot.bean;

public class Car {
    private String brand;
    private Integer price;

    public String getBrand(){return brand;}
    public void setBrand(String brand){this.brand = brand;}

    public Integer getPrice(){return price;}
    public void setPrice(Integer price){this.price = price;}

    @Override
    public String toString(){
        return "Car{" + 
                "brand = " + brand + '\'' + 
                ", price = " + price + 
                "}";
    }
}

我們可以看做是JavaBean Car

Car有倆個(gè)屬性:一個(gè)是brand(品牌),另一個(gè)是price(價(jià)格)

我現(xiàn)在想把跟Car有關(guān)的屬性放到配置里面,我們就放springboot的application.properties這個(gè)配置文件里面。配置文件我隨便寫:比如我們直接寫個(gè)mycar

application.properties

mycar.brand=BYD
#我的汽車的這個(gè)品牌,比如BYD(比亞迪)

mycar.price=100000
#我汽車的這個(gè)價(jià)格

現(xiàn)在我配了汽車的倆個(gè)信息;那如果是我們以前我們要讀取這個(gè)配置文件我們要在Car.java里面封裝很麻煩現(xiàn)在怎么做(一個(gè)注解,叫@ConfigurationProperties):

@ConfigurationProperties
public class Car{...}

ConfigurationProperties.java

package org.springframework.boot.context.properties;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.core.annotation.AliasFor;
import org.springframework.stereotype.Indexed;

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface ConfigurationProperties {

 @AliasFor("prefix")
 String value() default "";

 @AliasFor("value")
 String prefix() default "";

 boolean ignoreInvalidFields() default false;

 boolean ignoreUnknownFields() default true;

}

這個(gè)里面有我們要寫的東西叫prefix(@AliasFor("prefix")),這個(gè)prefix跟這個(gè)value()其實(shí)都是互相都是別名(@AliasFor)

@ConfigurationProperties(prefix = "mycar")
public class Car{...}

這個(gè)prefix指的是這個(gè)前綴,這個(gè)前綴的意思就是我們這個(gè)Car類里面的每一個(gè)屬性跟配置文件哪個(gè)前綴下的屬性一 一綁定。我們配置文件里面正好有mycar它的這個(gè)品牌名(brand)還有我們這個(gè)價(jià)格(price)跟我們JavaBean里面的品牌(brand)和價(jià)格(price)一模一樣所以我就把mycar寫上。

寫上以后我們?yōu)榱俗屗?,我們把這個(gè)組件**加到容器(@Component)**中 , 因?yàn)槲覀內(nèi)萜髦械慕M件才能擁有我們SpingBoot給它提供的強(qiáng)大功能(也就是容器提供的強(qiáng)大功能)

我們來測(cè)試一下:

我們Car組件(Car.java)它里的這些值是不是默認(rèn)已經(jīng)跟application.properties配置文件里面的mycar它下面的值一 一綁定上了?(寫一個(gè)Controller進(jìn)行測(cè)試)

HelloController.java

public Car car(){
 return 
}

這個(gè)car從哪來? 因?yàn)槲覀冇聾Component放在容器中了,而且它這個(gè)容器中實(shí)例的每一個(gè)屬性的值都跟配置文件中綁定的,所以我想要用的話,直接利用Spring的自動(dòng)注入(@Autowired)把容器中的Car拿過來就行了

@Autowired
Car car;

@RequestMapping("/car")//處理一個(gè)請(qǐng)求
public Car car(){
    return car;//我們返回這Car
}

打開瀏覽器輸入localhost:8080/car,得到的結(jié)果為:

{"brand":"BYD","price":100000}

包括我們配置文件改了:

mycar.brand=YD
#我的汽車的這個(gè)品牌,比如BYD(比亞迪)

mycar.price=100000
#我汽車的這個(gè)價(jià)格

注意:配置文件改了我們程序一定要重新啟動(dòng)

然后重新測(cè)試:

{"brand":"YD","price":100000}

所以現(xiàn)在想要讓一個(gè)JavaBean與配置文件里面的東西一 一綁定,我們第一種辦法就是@ConfigurationProperties注解 , 我們?nèi)萜髦械慕M件,標(biāo)注@ConfigurationProperties注解。

這個(gè)方式叫@Component + @ConfigurationProperties

第二個(gè)辦法,還有一種寫的方式

第二個(gè)方式就是:

@EnableConfigurationProperties + @ConfigurationProperties

比如我們?cè)谂渲妙?MyConfig)里面(第二種方式一定要在配置類里面寫,因?yàn)榕渲妙愂紫仁侨萜髦械慕M件(@Configuration))然后我們?cè)谂渲妙惿蠈懯裁床拍苌??寫一個(gè)@EnableConfigurationProperties意思就是開啟我們這個(gè)屬性配置功能,開啟誰的屬性配置功能?我們這個(gè)Car想要跟人綁定所以我們把Car

傳進(jìn)@EnableConfigurationProperties()里面來:

@Configuration(proxyBeanMethods = false)//告訴SpringBoot這是一個(gè)配置類(把這個(gè)類說明@Configuration類似于告訴spring這個(gè)文件是配置文件)

@ConditionalOnMissingBean(name = "tom")
@ImportResource("classpath:beans.xml")
@EnableConfigurationProperties(Car.class)
public class MyConfig {...}
 

那我們這個(gè)@EnableConfigurationProperties就有倆個(gè)功能:

1、開啟Car的配置綁定(屬性配置)功能

  • 你只有開啟了Car的屬性配置功能也就是Car.java下面的屬性配置才能生效想要開啟屬性配置功能第一個(gè)你明顯的標(biāo)注@EnableConfigurationProperties()開啟誰的屬性配置功能(這里只Car)。
  • 第二種辦法就是你只要這個(gè)組件在容器(@Component)中 , 它默認(rèn)我們提供的這些功能他就能生效

2、把這個(gè)組件自動(dòng)注冊(cè)到容器中(這里指Car這個(gè)組件)

  • 相當(dāng)于我們就不用再寫@Component了。因?yàn)橛行r(shí)候可能是這樣子的:我們的這個(gè)Car有可能是引用的是第三方包里面的,第三方包里面的人家類里面有可能沒標(biāo)@Component,你是不是也不可能往人家寫的類上標(biāo)@Component, 那咋辦呢?我就可以用@EnableConfigurationProperties()把人家的第三方包一整過來。@EnableConfigurationProperties的倆個(gè)功能(1)開啟了你的配置綁定(2)把你這個(gè)使用別人第三方包的組件自動(dòng)注冊(cè)到了容器中,我們還能測(cè)試生效

我們不用@EnableConfigurationProperties我們只說Car是屬性綁定(@ConfigurationProperties)而且沒把它加在容器(@Component)中。

***************************
APPLICATION FAILED TO START
***************************

Description:

Field car in com.chentianyu.boot.controller.HelloController required a bean of type 'com.chentianyu.boot.bean.Car' that could not be found.

The injection point has the following annotations:
 - @org.springframework.beans.factory.annotation.Autowired(required=true)

Action:

Consider defining a bean of type 'com.chentianyu.boot.bean.Car' in your configuration.

Process finished with exit code 1

我們啟動(dòng)都報(bào)錯(cuò)了,報(bào)錯(cuò)的原因就是HelloController.java里面有用Car這個(gè)Car在容器中沒有,所以拿不到,自動(dòng)裝配(@Autowired)失敗,所以我們這一塊報(bào)錯(cuò)了。

倆種辦法

  • 你要么就把它(@ConfigurationProperties)加在容器(@Component)中
  • 要么就使用這種開啟功能的方式(@EnableConfigurationProperties)

這倆種都行,這是我們說的配置綁定,有了這個(gè)配置綁定那我們后來其實(shí)哪怕自定義的一些配置(比如 mycar.brand和mycar.price)你想綁給哪個(gè)JavaBean就綁給哪個(gè)JavaBean , 只是一個(gè)@ConfigurationProperties注解的問題,我們不用再寫以前一堆的代碼,而且ConfigurationProperties我們?cè)谖磥鞸pringBoot底層大家經(jīng)常見到,你見到這個(gè)東西@ConfigurationProperties就說明這個(gè)類(Car)中的所有屬性是跟SpringBoot核心配置文件(application.properties),你也不能隨便寫一個(gè)別的文件 它綁定不上,是跟我們application.properties這個(gè)核心文件里面prefix = "mycar"這個(gè)前綴下邊的所有東西進(jìn)行綁定的

到此這篇關(guān)于SpringBoot中@ConfigurationProperties 配置綁定的文章就介紹到這了,更多相關(guān)@ConfigurationProperties 配置綁定內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • XML Web 服務(wù) Eclipse實(shí)現(xiàn)sun-jaxws.xml文件的方法

    XML Web 服務(wù) Eclipse實(shí)現(xiàn)sun-jaxws.xml文件的方法

    在sun-jaxws.xml文件,可以配置endpoint、handler-chain等內(nèi)容,在這個(gè)文件中配置的內(nèi)容會(huì)覆蓋在Java代碼中使用注解屬性配置的的內(nèi)容,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2023-11-11
  • Java 添加、刪除、替換、格式化Word中的文本的步驟詳解(基于Spire.Cloud.SDK for Java)

    Java 添加、刪除、替換、格式化Word中的文本的步驟詳解(基于Spire.Cloud.SDK for Java)

    這篇文章主要介紹了Java 添加、刪除、替換、格式化Word中的文本(基于Spire.Cloud.SDK for Java),本文分步驟通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • springboot配置https訪問的方法

    springboot配置https訪問的方法

    這篇文章主要介紹了springboot配置https訪問的方法,需要的朋友可以參考下
    2018-11-11
  • SpringBoot使用AOP+注解實(shí)現(xiàn)簡(jiǎn)單的權(quán)限驗(yàn)證的方法

    SpringBoot使用AOP+注解實(shí)現(xiàn)簡(jiǎn)單的權(quán)限驗(yàn)證的方法

    這篇文章主要介紹了SpringBoot使用AOP+注解實(shí)現(xiàn)簡(jiǎn)單的權(quán)限驗(yàn)證的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-05-05
  • 使用Java生成和識(shí)別二維碼的簡(jiǎn)易教程

    使用Java生成和識(shí)別二維碼的簡(jiǎn)易教程

    在當(dāng)今瞬息萬變的商業(yè)和技術(shù)環(huán)境中,二維碼已成為快速、高效信息傳遞的代名詞,本文將為您介紹 Spire.Barcode for Java 這一強(qiáng)大工具,它能幫助您輕松應(yīng)對(duì)Java應(yīng)用程序中的二維碼生成與識(shí)別挑戰(zhàn),需要的朋友可以參考下
    2025-09-09
  • Java設(shè)計(jì)模式之外觀模式的實(shí)現(xiàn)方式

    Java設(shè)計(jì)模式之外觀模式的實(shí)現(xiàn)方式

    這篇文章主要介紹了Java設(shè)計(jì)模式之外觀模式的實(shí)現(xiàn)方式,外觀模式隱藏系統(tǒng)的復(fù)雜性,并向客戶端提供了一個(gè)客戶端可以訪問系統(tǒng)的接口,這種類型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它向現(xiàn)有的系統(tǒng)添加一個(gè)接口,來隱藏系統(tǒng)的復(fù)雜性,需要的朋友可以參考下
    2023-11-11
  • 使用Spring Cache和Redis實(shí)現(xiàn)查詢數(shù)據(jù)緩存

    使用Spring Cache和Redis實(shí)現(xiàn)查詢數(shù)據(jù)緩存

    在現(xiàn)代應(yīng)用程序中,查詢緩存的使用已經(jīng)變得越來越普遍,它不僅能夠顯著提高系統(tǒng)的性能,還能提升用戶體驗(yàn),在這篇文章中,我們將探討緩存的基本概念、重要性以及如何使用Spring Cache和Redis實(shí)現(xiàn)查詢數(shù)據(jù)緩存,需要的朋友可以參考下
    2024-07-07
  • SpringSecurity跨域請(qǐng)求偽造(CSRF)的防護(hù)實(shí)現(xiàn)

    SpringSecurity跨域請(qǐng)求偽造(CSRF)的防護(hù)實(shí)現(xiàn)

    本文主要介紹了SpringSecurity跨域請(qǐng)求偽造(CSRF)的防護(hù)實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • java如何實(shí)現(xiàn)項(xiàng)目啟動(dòng)時(shí)執(zhí)行指定方法

    java如何實(shí)現(xiàn)項(xiàng)目啟動(dòng)時(shí)執(zhí)行指定方法

    這篇文章主要為大家詳細(xì)介紹了java項(xiàng)目如何啟動(dòng)時(shí)執(zhí)行指定方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • ThreadLocal導(dǎo)致JVM內(nèi)存泄漏原因探究

    ThreadLocal導(dǎo)致JVM內(nèi)存泄漏原因探究

    ThreadLocal是JDK提供的線程本地變量機(jī)制,但若使用不當(dāng)可能導(dǎo)致內(nèi)存泄漏。正確的使用方式是在使用完后及時(shí)remove,或者使用弱引用等手段避免強(qiáng)引用導(dǎo)致的內(nèi)存泄漏。在多線程編程中,合理使用ThreadLocal可以提高并發(fā)性能,但也需要注意其潛在的內(nèi)存泄漏問題
    2023-04-04

最新評(píng)論

合水县| 抚远县| 六枝特区| 闽清县| 黎平县| 洪泽县| 杭锦后旗| 嘉黎县| 大关县| 镇江市| 甘德县| 综艺| 白水县| 老河口市| 象州县| 公主岭市| 曲麻莱县| 龙泉市| 德格县| 聂拉木县| 赤城县| 胶州市| 峨边| 明溪县| 邵阳市| 杭锦后旗| 平遥县| 肇源县| 民乐县| 正宁县| 马关县| 泸西县| 年辖:市辖区| 中方县| 崇州市| 新乡市| 临泉县| 广南县| 衢州市| 宁都县| 高碑店市|