天天看點

SpringBoot (六) 整合配置檔案 @Value、ConfigurationProperties

哈喽,大家好,我是有勇氣的牛排(全網同名)🐮🐮🐮

有問題的小夥伴歡迎在文末評論,點贊、收藏是對我最大的支援!!!。

1 使用 @Value 注解

/*
 * @Author  : 有勇氣的牛排
 * @FileName: ReadProperties.java
 * desc     :
 * */

package com.couragesteak.service;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ReadProperties {

    @Value("${cs.name}")
    private String name;
    @Value("${cs.star}")
    private String star;

    // http://127.0.0.1:8080/getProperties
    @RequestMapping("/getProperties")
    public String getProperties() {
        return name + ":" + star;
    }
}
           

2 使用 ConfigurationProperties

@ConfigurationProperties

加載配置通過 BeanPostProcessor實作,其對應的Bean的後置處理器為 ConfigurationPropertiesBindingPostProcessor,也就是在bean被執行個體化後,會調用後置處理器,遞歸的查找屬性,通過反射機制注入值,是以需要提供getter和setter方法。

此外,針對此種屬性注入的方式,SpringBoot支援

Relaxed Bingding

,即秩序保證配置檔案的屬性和setter方法名相同即可。

注意事項

(1) 屬性必須要有getter、setter方法

(2) 如果屬性類型是集合,需要確定集合是不可變的。

(3) 如果使用Lombok自動生成 getter/setter方法,一定不要生成對應的任何構造函數,因為Spring IOC容器會自動使用它來執行個體化對象。

(4) 使用JavaBean屬性綁定的方式隻針對

标準Java Bean屬性

,不支援對靜态屬性的綁定。

配置檔案

application.yml

cs:
  name: cs
  star: 9
           

2.1 Maven依賴

<!--導入配置檔案處理器,配置檔案進行綁定就會有提示-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>
           

2.2 實體類

/*
 * @Author  : 有勇氣的牛排
 * @FileName: UserEntity.java
 * desc     :
 * */

package com.couragesteak.entity;

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

@Component
@ConfigurationProperties(prefix = "cs")
public class UserEntity {
    private String name;
    private String star;

    public String getName() {
        return name;
    }

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

    public String getstar() {
        return star;
    }

    public void setstar(String star) {
        this.star = star;
    }

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

           

2.3 後端

/*
 * @Author  : 有勇氣的牛排
 * @FileName: ReadProperties_ConfigurationProperties.java
 * desc     : ConfigurationProperties 配置檔案讀取
 * */

package com.couragesteak.service;

import com.couragesteak.entity.UserEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ReadProperties_ConfigurationProperties {

    @Autowired
    private UserEntity userEntity;

    //
    @RequestMapping("/getInfo")
    public String getInfo(String userName, Integer age){
        System.out.println("666");
        return userEntity.toString();
    }
}
           

注意事項

Spring考慮到帶有注釋@ConfigurationProperties的類可能不适合掃描(比如:我正在開發自己的自動配置或希望有條件地啟用它們),是以Spring并不會自動掃描帶有注釋@ConfigurationProperties的類。

在這些情況下,推薦使用@EnableConfigurationProperties注解指定要處理的類型清單(即:将@ConfigurationProperties注釋的類加到Spring IOC容器中)。一般通過将@EnableConfigurationProperties加在@Configuration類上完成。

3 @Value和@ConfigurationProperties的差別

(1) @ConfigurationProperties注解支援屬性檔案和javabean映射;而@Value支援spel表達式。

(2) @ConfigurationProperties注解支援全量的屬性,寬松綁定方式;而@Vavlue隻推薦使用标準的

kebab-case

方式(僅使用小寫字母和

-

),例如

@Value("{demo.item-price}")

可以提取

demo.item-price

demo-itemPrice

(3) 對于多個屬性映射,并且屬性嘗嘗被複用時,推薦使用@ConfigurationProperties;隻讀取單個屬性使用@Value更加友善。

參考位址:

  • 餘勝軍
  • https://developer.aliyun.com/article/1058227
  • https://www.couragesteak.com/article/292