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

SpringBoot中@Value獲取值和@ConfigurationProperties獲取值用法及比較

 更新時(shí)間:2024年08月08日 09:41:48   作者:岳軒子  
在Spring Boot中,@Value注解是一個(gè)非常有用的特性,它允許我們將外部的配置注入到我們的Bean中,@ConfigurationProperties用于將配置文件中的屬性綁定到 Java Bean 上,本文介紹了@Value獲取值和@ConfigurationProperties獲取值用法及比較,需要的朋友可以參考下

1. 簡介

1.1 @value

在Spring Boot中,@Value注解是一個(gè)非常有用的特性,它允許我們將外部的配置(如application.properties或application.yml文件中的屬性)注入到我們的Bean中。這對于讀取配置信息,如數(shù)據(jù)庫連接信息、服務(wù)地址等,非常有用。

基本用法

@Value注解可以應(yīng)用于字段、setter方法或配置方法上。它使用SpEL(Spring Expression Language)表達(dá)式來讀取配置值。

1.2 @ConfigurationProperties

@ConfigurationProperties 是 Spring Boot 提供的一個(gè)非常強(qiáng)大的注解,用于將配置文件中的屬性綁定到 Java Bean 上。與 @Value 注解相比,@ConfigurationProperties 提供了更豐富的特性,比如松散綁定(relaxed binding)、JSR-303 數(shù)據(jù)校驗(yàn)以及復(fù)雜的類型綁定等。

基本用法

  1. 定義一個(gè)配置類:首先,你需要定義一個(gè)配置類,并使用 @ConfigurationProperties 注解來指定配置的前綴。
  2. 啟用配置屬性綁定:默認(rèn)情況下,Spring Boot 會自動掃描帶有 @ConfigurationProperties 注解的類,并將它們注冊為 Spring 應(yīng)用上下文中的 bean。但是,如果你想要精確地控制哪些配置類被注冊,你可以在 @EnableConfigurationProperties 注解中指定它們。
  3. 在配置文件中設(shè)置屬性:在 application.properties 或 application.yml 文件中設(shè)置與配置類屬性相對應(yīng)的配置項(xiàng)。

2. 使用

2.1 @value的使用

首先創(chuàng)建springboot的項(xiàng)目

創(chuàng)建application.yml

person:
  name : 岳軒子
  sex : 雄
  age : 18
  birthday : 2002/2/31
  maps : { k1 : 20 , k2 : 21}
  lists : [小黃 , 小黑]
  dog:
    name : 旺財(cái)

創(chuàng)建Person.java

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;

import java.util.Date;
import java.util.List;
import java.util.Map;

@Component
@Validated
public class Person {
    @Value("${person.name}")
    private String name;
    @Value("${person.sex}")
    private Character sex;
    @Value("${person.age}")
    private Integer age;
    @Value("${person.birthday}")
    private Date birthday;
    private Map<String, Integer> maps;
    private List<String> lists;
    private Dog dog;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Character getSex() {
        return sex;
    }

    public void setSex(Character sex) {
        this.sex = sex;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public Map<String, Integer> getMaps() {
        return maps;
    }

    public void setMaps(Map<String, Integer> maps) {
        this.maps = maps;
    }

    public List<String> getLists() {
        return lists;
    }

    public void setLists(List<String> lists) {
        this.lists = lists;
    }

    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", sex=" + sex +
                ", age=" + age +
                ", birthday=" + birthday +
                ", maps=" + maps +
                ", lists=" + lists +
                ", dog=" + dog +
                '}';
    }
}

創(chuàng)建Dog類

package com.example.springbootdaily.model;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;

@Component
@Validated
public class Dog {
    @Value("${person.dog.name}")
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                '}';
    }
}

寫一個(gè)測試類

import com.example.springbootdaily.model.Person;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringTest {
    @Autowired
    Person person;

    @Test
    public void print(){
        System.out.println(person);
    }
}

運(yùn)行結(jié)果:

Person{name='岳軒子', sex=雄, age=18, birthday=Sun Mar 03 00:00:00 CST 2002, maps=null, lists=null, dog=null}

2.2 @ConfigurationProperties的用法

創(chuàng)建Person2.java

package com.example.springbootdaily.model;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;

import java.util.Date;
import java.util.List;
import java.util.Map;

@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person2 {
    private String name;
    private Character sex;
    private Integer age;
    private Date birthday;
    private Map<String, Integer> maps;
    private List<String> lists;
    private Dog dog;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Character getSex() {
        return sex;
    }

    public void setSex(Character sex) {
        this.sex = sex;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public Map<String, Integer> getMaps() {
        return maps;
    }

    public void setMaps(Map<String, Integer> maps) {
        this.maps = maps;
    }

    public List<String> getLists() {
        return lists;
    }

    public void setLists(List<String> lists) {
        this.lists = lists;
    }

    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", sex=" + sex +
                ", age=" + age +
                ", birthday=" + birthday +
                ", maps=" + maps +
                ", lists=" + lists +
                ", dog=" + dog +
                '}';
    }
}

Dog類

package com.example.springbootdaily.model;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;

@Component
@Validated
public class Dog {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                '}';
    }
}

寫測試類

 @Test
 public void print3(){
     System.out.println(person2);
 }

運(yùn)行結(jié)果:

Person{name='岳軒子', sex=雄, age=18, birthday=Sun Mar 03 00:00:00 CST 2002, maps={k1=20, k2=21}, lists=[小黃, 小黑], dog=Dog{name='旺財(cái)'}}

3. 區(qū)別

3.1 松散綁定

@ConfigurationProperties 的松散綁定(relaxed binding)是 Spring Boot 提供的一個(gè)特性,它允許你在配置文件中使用不同的命名風(fēng)格(如駝峰命名、短橫線分隔等),而 Spring Boot 能夠自動地將其映射到 Java Bean 的屬性上。這種特性使得配置文件的編寫更加靈活,同時(shí)也使得 Java Bean 的屬性命名更加符合 Java 的命名習(xí)慣。

松散綁定的工作原理:
當(dāng)你使用 @ConfigurationProperties 注解來綁定配置文件中的屬性時(shí),Spring Boot 會嘗試根據(jù)以下規(guī)則來匹配屬性名:

  1. 駝峰命名與短橫線分隔的互轉(zhuǎn):如果你的 Java Bean 屬性使用駝峰命名(如 myProperty),那么你可以在配置文件中使用短橫線分隔的形式(如 my-property)來設(shè)置這個(gè)屬性的值。Spring Boot 會自動地將這兩種命名風(fēng)格進(jìn)行轉(zhuǎn)換。
  2. 忽略大小寫:在松散綁定中,大小寫通常會被忽略,但請注意,這取決于你使用的配置文件格式(如 YAML 是大小寫敏感的,而 properties 文件則不是)。然而,即使對于大小寫敏感的文件格式,Spring Boot 也會嘗試以智能的方式匹配屬性名。
  3. 環(huán)境變量:對于環(huán)境變量,松散綁定的規(guī)則也適用。通常,環(huán)境變量名使用大寫字母和下劃線(如 MY_PROPERTY),而 Java Bean 屬性則使用駝峰命名。Spring Boot 能夠處理這種差異。

例子

application.yml
這里的name中間加了一個(gè)線

person:
  na-me : 岳軒子
  sex : 雄
  age : 18
  birthday : 2002/2/31
  maps : { k1 : 20 , k2 : 21}
  lists : [小黃 , 小黑]
  dog:
    name : 旺財(cái)

仍然可以獲取
運(yùn)行結(jié)果:

Person{name='岳軒子', 

3.2 SpEL

SpEL(Spring Expression Language)是 Spring 框架中的一個(gè)功能強(qiáng)大的表達(dá)式語言,它支持在運(yùn)行時(shí)查詢和操作對象圖。SpEL 是一種類似于 JSP EL(JavaServer Pages Expression Language)但功能更強(qiáng)大的表達(dá)式語言,它用于在運(yùn)行時(shí)查詢和操作數(shù)據(jù)。

主要用途

Bean 屬性的動態(tài)訪問:在 Spring 配置文件中,你可以使用 SpEL 來動態(tài)地訪問和設(shè)置 Bean 的屬性。
注解中的屬性值:在 Spring 的注解中,你也可以使用 SpEL 來設(shè)置注解的屬性值。
XML 配置中的屬性值:在 Spring 的 XML 配置文件中,可以通過 標(biāo)簽的 value 或 ref 屬性結(jié)合 SpEL 來設(shè)置屬性值。
@Value 注解:在 Java 代碼中,可以使用 @Value 注解結(jié)合 SpEL 來注入配置值或計(jì)算結(jié)果。

特點(diǎn)

功能強(qiáng)大:支持基本運(yùn)算、關(guān)系運(yùn)算、邏輯運(yùn)算、正則表達(dá)式匹配、集合操作等。
易于使用:語法簡潔,易于學(xué)習(xí)和使用。
集成性好:與 Spring 框架緊密結(jié)合,可以在 Spring 的各種場景中使用。

例子

運(yùn)行結(jié)果

age=20,

3.3 JSP303數(shù)據(jù)校驗(yàn)

先導(dǎo)入依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

這里是@Value,不支持

@Email
@Value("${person.name}")
private String name;

如果不是email的話,會報(bào)錯(cuò)

3.4 復(fù)雜類型封裝

前面已經(jīng)使用了,@Value不能封裝map,list和對象類型
但是@ConfigurationProperties可以

以上就是SpringBoot中@Value獲取值和@ConfigurationProperties獲取值用法及比較的詳細(xì)內(nèi)容,更多關(guān)于@Value和@ConfigurationProperties比較的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot + MQTT實(shí)現(xiàn)取貨就走的智能售貨柜系統(tǒng)完整流程

    SpringBoot + MQTT實(shí)現(xiàn)取貨就走的智能售貨柜系統(tǒng)完整流程

    本文介紹了一種智能售貨柜的工作原理和實(shí)現(xiàn)流程,該系統(tǒng)通過多傳感器數(shù)據(jù)融合、實(shí)時(shí)視頻流處理和異步處理,提供無感購物體驗(yàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2026-03-03
  • Java深入講解二十三種設(shè)計(jì)模式之中的策略模式

    Java深入講解二十三種設(shè)計(jì)模式之中的策略模式

    策略模式屬于Java 23種設(shè)計(jì)模式中行為模式之一,該模式定義了一系列算法,并將每個(gè)算法封裝起來,使它們可以相互替換,且算法的變化不會影響使用算法的客戶。本文將通過示例詳細(xì)講解這一模式,需要的可以參考一下
    2022-05-05
  • spring Boot打包部署到遠(yuǎn)程服務(wù)器的tomcat中

    spring Boot打包部署到遠(yuǎn)程服務(wù)器的tomcat中

    這篇文章主要給大家介紹了關(guān)于spring Boot打包部署到遠(yuǎn)程服務(wù)器的tomcat中的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • SpringBoot+Vue實(shí)現(xiàn)SM4加密傳輸

    SpringBoot+Vue實(shí)現(xiàn)SM4加密傳輸

    本文主要介紹了SpringBoot+Vue實(shí)現(xiàn)SM4加密傳輸,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-02-02
  • SpringBoot使用prometheus監(jiān)控的示例代碼

    SpringBoot使用prometheus監(jiān)控的示例代碼

    這篇文章主要介紹了SpringBoot使用prometheus監(jiān)控的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Java8使用Supplier啟動ScheduledThread代碼實(shí)例

    Java8使用Supplier啟動ScheduledThread代碼實(shí)例

    這篇文章主要介紹了Java8使用Supplier啟動ScheduledThread詳解,項(xiàng)目開啟立即啟動定時(shí)任務(wù)是很多項(xiàng)目都會遇到的一個(gè)需求,如何利用Java提供的函數(shù)優(yōu)雅的寫出來十分考驗(yàn)一個(gè)人的功底,需要的朋友可以參考下
    2024-01-01
  • Java GUI制作簡單的管理系統(tǒng)

    Java GUI制作簡單的管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java GUI制作簡單的管理系統(tǒng)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • rabbitmq五種模式詳解(含實(shí)現(xiàn)代碼)

    rabbitmq五種模式詳解(含實(shí)現(xiàn)代碼)

    這篇文章主要介紹了rabbitmq五種模式詳解(含實(shí)現(xiàn)代碼),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • 如何實(shí)現(xiàn)bean初始化摧毀方法的注入

    如何實(shí)現(xiàn)bean初始化摧毀方法的注入

    這篇文章主要為大家介紹了如何實(shí)現(xiàn)bean初始化摧毀方法的注入詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • 詳解Java字節(jié)碼編程之非常好用的javassist

    詳解Java字節(jié)碼編程之非常好用的javassist

    這篇文章主要介紹了詳解Java字節(jié)碼編程之非常好用的javassist,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04

最新評論

芦山县| 灵寿县| 桦川县| 平乐县| 武功县| 杨浦区| 商洛市| 福建省| 山阴县| 万山特区| 当雄县| 耿马| 广安市| 淮滨县| 绿春县| 宁海县| 蓬安县| 西吉县| 宝山区| 龙泉市| 大方县| 库伦旗| 兴城市| 慈溪市| 无锡市| 滕州市| 民勤县| 婺源县| 綦江县| 松桃| 栾城县| 广德县| 通化县| 根河市| 神池县| 丰城市| 宝丰县| 七台河市| 玉山县| 政和县| 昌图县|