欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot中@ConfigurationProperties 配置綁定

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

SpringBoot底層的一個功能 : @ConfigurationProperties

@ConfigurationProperties 配置綁定

來舉一個場景例子 :

我們習(xí)慣于把經(jīng)常變化的一個東西配到配置文件里面。比如把數(shù)據(jù)庫的一些鏈接地址、賬號、密碼包括數(shù)據(jù)庫連接池的大小等等這些屬性配到properties配置文件里面,然后為了方便 , 因為我們未來可能要創(chuàng)建數(shù)據(jù)庫連接池,我們會把這個配置文件里面的內(nèi)容又一一解析到我們數(shù)據(jù)庫連接池(比如javaBean我們這個對象里面),所以我們這個實現(xiàn)場景就是把properties里面的所有配置綁定JavaBean里面。那我們這個綁定過程如果用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這個類我們加載來我們這個配置文件(pps.load(new FileInputStream("a.properties"));)然后遍歷(while(enum1.hasMoreElements()))配置文件的每一個kv(key-value)值(String strKey = (String) enum1.nextElement(); String strValue = pps.getProperty(strKey););然后把kv值一一對應(yīng)封裝到JavaBean指定的屬性里

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

我在這舉了個例子:

我在這寫了一個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有倆個屬性:一個是brand(品牌),另一個是price(價格)

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

application.properties

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

mycar.price=100000
#我汽車的這個價格

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

}

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

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

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

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

我們來測試一下:

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

HelloController.java

public Car car(){
 return 
}

這個car從哪來? 因為我們用@Component放在容器中了,而且它這個容器中實例的每一個屬性的值都跟配置文件中綁定的,所以我想要用的話,直接利用Spring的自動注入(@Autowired)把容器中的Car拿過來就行了

@Autowired
Car car;

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

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

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

包括我們配置文件改了:

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

mycar.price=100000
#我汽車的這個價格

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

然后重新測試:

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

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

這個方式叫@Component + @ConfigurationProperties

第二個辦法,還有一種寫的方式

第二個方式就是:

@EnableConfigurationProperties + @ConfigurationProperties

比如我們在配置類(MyConfig)里面(第二種方式一定要在配置類里面寫,因為配置類首先是容器中的組件(@Configuration))然后我們在配置類上寫什么才能生效?寫一個@EnableConfigurationProperties意思就是開啟我們這個屬性配置功能,開啟誰的屬性配置功能?我們這個Car想要跟人綁定所以我們把Car

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

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

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

那我們這個@EnableConfigurationProperties就有倆個功能:

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

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

2、把這個組件自動注冊到容器中(這里指Car這個組件)

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

我們不用@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

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

倆種辦法

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

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

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

相關(guān)文章

最新評論