Spring Boot 入門示例(四):Spring Boot 資源配置文件讀取

Spring Boot 資源配置文件讀取

在實際開發中,我們會遇到關於配置文件的讀取,獲取配置文件的自定義配置,以及如何多環境下的配置文件信息的獲取。

配置讀取優先級

  1. 命令行參數。

  2. java:comp/env 得到的 JNDI 屬性。

  3. 通過 System.getProperties() 獲取的 Java 系統參數。

  4. 操作系統環境變量。

  5. RandomValuePropertySource 配置的 random.* 屬性值。如 random.int{random.int}、{random.long}、random.value{random.value}、{random.uuid} 等。

  6. JAR 包外部的 application-{profile}.propertiesapplication.yml (帶 spring.profile)配置文件。

  7. JAR 包內部的 application-{profile}.propertiesapplication.yml (帶 spring.profile)配置文件。

  8. JAR 包外部的 application.propertiesapplication.yml(不帶 spring.profile)配置文件。

  9. JAR 包內部的 application.propertiesapplication.yml(不帶 spring.profile)配置文件。
    (從 JAR 包外向 JAR 包內進行尋找,優先加載帶 {profile} 的文件,再加載不帶 {profile}的文件)

  10. @Configuration 註解類上的 @PropertySource

  11. 通過 SpringApplication.setDefaultProperties 指定默認屬性。

注意:application.properties 文件的優先級高於 application.yml 文件的優先級。

配置依賴項

在 pom.xml 文件中,加入 spring-boot-configuration-processor 依賴項,用於讀取配置值。

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-configuration-processor</artifactId>
  <optional>true</optional>
</dependency>

屬性配置與實體類的映射

  • application.properties
# 32 位隨機字符串
rand.stringValue = ${random.value}
# 隨機的 int 類型數字
rand.intNumber = ${random.int}
# 隨機的 long 類型數字
rand.longNumber = ${random.long}
# 100 以內的隨機int類型
rand.number = ${random.int(100)}
# 0-100 範圍內的隨機int類型
rand.rangeNumber = ${random.int[0,100]}
  • author.properties
author.name = yifanzheng
author.nickname = star
author.intro = good boy!

方式一

@Configuration 註解的類上加上 @ConfigurationProperties(prefix="前綴名") 註解,可以使用 @PropertySource 註解指定加載的配置文件,不加時默認加載 application.properties 文件

/**
 * AuthorConfig
 *
 * @author star
 **/
@Configuration
@ConfigurationProperties(prefix = "author")
@PropertySource(value = "classpath:author.properties") // 指定配置文件的位置
public class AuthorConfig {

    private String name;

    private String nickname;

    private String intro;

    public String getName() {
        return name;
    }

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

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }
}

注意:使用這種方式配置的類,在使用 @Autowired 注入時,不能直接 return 注入的對象,它只是指向 Spring 容器中對象資源的一個標識,可以通過這個標識返回該對象中的值。

方式二

使用 @Value 註解,直接映射實體類的各個屬性。

/*
* RandomConfig
*
* @author star
**/
@Component
public class RandomConfig {

   @Value("${rand.stringValue}")
   private String stringValue;

   @Value("${rand.intNumber}")
   private Integer intNumber;

   @Value("${rand.longNumber}")
   private Long longNumber;

   @Value("${rand.number}")
   private Integer number;

   @Value("${rand.rangeNumber}")
   private Integer rangeNumber;

   public String getStringValue() {
       return stringValue;
   }

   public void setStringValue(String stringValue) {
       this.stringValue = stringValue;
   }

   public Integer getIntNumber() {
       return intNumber;
   }

   public void setIntNumber(Integer intNumber) {
       this.intNumber = intNumber;
   }

   public Long getLongNumber() {
       return longNumber;
   }

   public void setLongNumber(Long longNumber) {
       this.longNumber = longNumber;
   }

   public Integer getNumber() {
       return number;
   }

   public void setNumber(Integer number) {
       this.number = number;
   }

   public Integer getRangeNumber() {
       return rangeNumber;
   }

   public void setRangeNumber(Integer rangeNumber) {
       this.rangeNumber = rangeNumber;
   }
}

方式三

在方法上使用 @Bean 註解,配合以上註解使用。

/**
 * AuthorBeanConfig 使用 @Bean 註解的方式獲取配置信息
 *
 * @author star
 **/
@Configuration
@PropertySource(value = "classpath:author.properties")
public class AuthorBeanConfig {

    @Bean
    @ConfigurationProperties(prefix = "author")
    public AuthorBean getAuthorBean(){
       return new AuthorBean();
    }
}

在沒有使用 @PropertySource 註解指定加載的文件時,默認使用 application.properties 文件中與實體對象的屬性相同的配置項。
@PropertySources 註解優先級比較低,即使指定了加載的文件,但出現與 application.properties 文件相同的配置項時會被其覆蓋。

自定義 YAML 資源文件屬性配置

  • 創建 user.yml 文件,進行屬性配置
# 配置 user 對象的值
demo:
 user:
  name: star
  age: 22
  desc: good boy!
  • 使用註解標記 User.java 對象文件
/**
 * UserConfig
 *
 * @author star
 **/
@Configuration
@ConfigurationProperties(prefix = "demo.user") // 前綴名註釋必須有,不然會報錯
@PropertySource(value = "classpath:user.yml",encoding = "utf-8")
public class User {
    // @Value() 註解必須要
    @Value("${name}")
    private String name;

    @Value("${age}")
    private int age;

    @Value("${desc}")
    private String desc;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }
}

多環境配置

application-dev.properties: 開發環境
application-prod.properties: 生產環境

Spring Boot 通過 application.roperties 文件,設置 spring.profiles.active 屬性加載相應的文件,如:spring.profiles.active=dev

注意:Spring Boot 根據環境激活配置文件的規則是,默認加載 application.properties 文件,當此文件配置了 spring.profiles.active=xxx 後,會加載 application-xxx.properties 文件中的配置項,並覆蓋 application.properties 中相同的配置項。

最後

  1. 使用 YAML 文件時,屬性值和冒號中間必須要有空格。
  2. YAML 文件在配置中文值時,讀取不會出現亂碼問題;properties 文件配置中文值,讀取會出現亂碼。
    因爲 Spring Boot 是以 iso-8859-1 的編碼格式讀取 properties 文件。

後記

由於自身能力有限,若有錯誤或者不當之處,還請大家批評指正,一起學習交流!

GitHub 源碼地址:springboot-properties

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章