Spring Boot 全局配置文件

2.1.5 全局配置文件

​ 全局配置文件可以對一些默認的配置值進行修改。Spring Boot使用一個application.properties或application.yml/application.yaml的文件做爲全局配置文件,該文件放在 【src/main/resources】目錄或者類路徑的 【/config】,java

通常爲放在resources目錄。spring

咱們能夠在 application.properties / application.yml文件中定義Spring Boot定義項目的相關屬性,固然,這些屬性能夠是系統屬性、環境變量、命令參數等信息,也能夠是自定義配置文件名稱和位置。數組

# 指定項目運行端口
server.port=8080
# 指定項目應用上下文路徑
server.servlet.context-path=/learn
# 指定項目名
spring.application.name=learn
2.1.5.1 配置自動提示

​ 編寫配置時,因爲咱們配置的Person對象屬性是咱們自定義的,Spring Boot 沒法自動識別,全部不會有任何屬性提示。在實際開發中,爲了出現代碼提示的效果方便配置,在使用@ConfigurationProperties註解進行配置文件屬性注入時,能夠在pom.xml文件中添加Spring Boot提供的配置處理依賴器。markdown

<!-- 配置處理器依賴 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

添加配置後,須要從新編譯、運行項目便可生效。app

2.1.5.2 演示準備

​ 首先準備兩個實體類:Pet、Person,下面經過application.properties和application.yml配置文件中的自定義配置屬性注入到Person實體類中框架

@Data
public class Pet {
    private String type;
    private String name;
}
@Data
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private int id; // id
    private String name; // 名稱
    private List hobby; // 愛好
    private String[] family; // 家庭成員
    private Map map;
    private Pet pet; // 寵物
}

@ConfigurationProperties(prefix = "person")註解的做用是將配置文件中以person開頭的屬性值經過setXXX()方法注入到實體類中less

@Component註解的做用是將當前注入屬性值的Person類對象做爲Bean組件放到Spring容器中,只有這樣才能被@ConfigurationProperties賦值dom

2.1.5.3 application.properties
person.id=1
person.name=張三
person.hobby=吃飯,睡覺,打豆豆
person.family=father,mother
person.map.k1=v1
person.map.k3=v2
person.pet.type=cat
person.pet.name=麻花

測試類ide

// 測試啓動類,並加載Spring Boot測試註解
@RunWith(SpringRunner.class)
// 標記爲Spring Boot單元測試類,並加載項目的ApplicationContext上下文環境
// classes 知道項目主程序啓動類
@SpringBootTest(classes = LearnApplication.class)
public class LearnApplicationTest {

    @Autowired
    private Person person;

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

}

打印結果spring-boot

Person(id=1, name=張三, hobby=[吃飯, 睡覺, 打豆豆], family=[father, mother], map={k1=v1, k3=v2}, pet=Pet(type=cat, name=麻花))

能夠看出,正確打印出了Person類對象,說明application.properties配置文件屬性配置正確,並經過相關注解自動完成了屬性注入。

2.1.5.4 application.yaml

​ yaml文件格式是Spring Boot支持的一種JSON超集文件格式,相比傳統的properties配置文件,yaml文件以數據爲核心,是一種更爲直觀且容易被電腦識別的數據序列化格式。application.yaml配置文件的工做原理和application.properties是同樣的,只不過yaml格式配置文件看起來更加簡潔一些。

  • yaml文件看擴展名能夠爲 .yaml或 .yml
  • application.yml文件使用 「key:(空格)value」 格式配置屬性,使用縮進控制層級關係

針對不一樣的數據類型有不一樣的格式

  • value值爲普通數據類型(數字,字符串、布爾等)

    server:
    port: 8081
    spring:
    application:
      name: demo
  • value值爲數組和單列集合

    主要有兩種書寫方式:縮進式寫法和行內寫法

    • 縮進式寫法
    person:
      hobby:
        - 吃飯
        - 睡覺
        - 打豆豆

    person:
      hobby:
        吃飯,
        睡覺,
        打豆豆
    • 行內寫法
    person:
      hobby: [吃飯,睡覺,打豆豆]

    person:
      hobby: 吃飯,睡覺,打豆豆
  • value值爲Map集合和對象

    主要有兩種書寫方式:縮進式寫法和行內寫法

    • 縮進式寫法
    person:
      map:
        k1: v1
        k2: v2
    • 行內式寫法
    person:
      map: {k1: v1-1,k2: v2-2}

測試

在resources下建立 application.yml

person:
  id: 1
  name: 羅傑
  hobby: [吃飯,睡覺,打豆豆]
  family: father,mother
  map: {k1: v1-1,k2: v2-2}
  pet:
    type: cat
    name: 麻花

測試類

// 測試啓動類,並加載Spring Boot測試註解
@RunWith(SpringRunner.class)
// 標記爲Spring Boot單元測試類,並加載項目的ApplicationContext上下文環境
// classes 知道項目主程序啓動類
@SpringBootTest(classes = LearnApplication.class)
public class LearnApplicationTest {

    @Autowired
    private Person person;

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

}

打印結果

Person(id=1, name=張三, hobby=[吃飯, 睡覺, 打豆豆], family=[father, mother], map={k1=v1, k3=v2}, pet=Pet(type=cat, name=麻花))

能夠看出,正確打印出了Person類對象,說明application.yml配置文件屬性配置正確,並經過相關注解自動完成了屬性注入。

2.1.5.5 配置文件屬性值注入

使用Spring Boot進行全局配置文件設置時:

  • 若是配置的屬性是Spring Boot已有屬性,例如服務端口server.port,那麼Spring Boot內部會自動掃描並讀取這些配置文件中的屬性值並默認覆蓋。
  • 若是配置的屬性是用戶自定義屬性,例如剛剛自定義的Person實體類屬性,還必須在程序中注入這些配置屬性方可生效。

Spring Boot支持多種注入配置文件屬性的方式,@ConfigurationProperties和@Value方式

2.1.5.5.1 @ConfigurationProperties

Spring Boot 提供 @ConfigurationProperties 註解用來快速、方便的將配置文件中自定義的屬性批量注入到某個Bean對象的多個屬性中。

@Data
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private int id; // id
    private String name; // 名稱
    private List hobby; // 愛好
    private String[] family; // 家庭成員
    private Map map;
    private Pet pet; // 寵物
}

上述代碼使用 @Component 和 @ConfigurationProperties(prefix = "person")將配置文件中的每一個屬性映射到Person類組件中。

2.1.5.5.2 @Value

@Value是 Spring 框架提供的,用來讀取配置文件中的屬性值,並逐個注入到Bean對象的對應屬性中,Spring Boot從Spring框架中對@Value註解進行了默認繼承,因此在Spring Boot框架中還可使用該註解讀取和注入配置文件屬性值。

@Data
@Component
public class People {
    @Value("${people.id}")
    private Integer id;
    @Value("${people.name}")
    private String name;
}
people:
  id: 1
  name: 李四

測試結果

People(id=1, name=李四)

能夠看出,屬性值正確打印,經過@Value能夠進行配置文件屬性值進行注入。

使用@Value註解使用注意事項

  • 若是使用@Value,在配置文件中配置對應屬性或者設置默認值,不然會出現異常

    Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'people.name' in value "${people.name}"

    默認值設置方式示例

    @Data
    @Component
    public class People {
      @Value("${people.id:10}")
      private Integer id;
      @Value("${people.flag:true}")
      private Boolean flag;
      // 設置默認值爲空字符串
      @Value("${people.name:}")
      private String name;
      // 設置默認值爲null
      @Value("${people.remark:#{null}}")
      private String remark;
    }
  • @Value註解對Map集合、對象以及yml文件格式的行內式寫法的配置文件的屬性注入都不支持,若是賦值會出現錯誤

    Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'people.name' in value "${people.name}"

2.1.6 自定義配置

Spring Boot免除了項目中大部分的手動配置,對於一些特定狀況,咱們能夠經過修改全局配置文件以適應具體生成環境,能夠說,幾乎全部的配置均可以寫在application.properties配置文件中,Spring Boot會自動加載全局配置文件從而免除咱們手動加載的煩惱。

可是,若是咱們自定義配置文件,Spring Boot是沒法識別這些配置文件的,此時須要咱們手動加載。

2.1.6.1 @PropertySource

對應這種加載自定義配置文件的需求,可使用@PropertySource註解結合@Component註解的方式來實現。

@PropertySource註解做用是用於指定自定義配置文件的具體位置和名稱,同時,爲了保證Spring Boot可以掃描該註解,還須要在其類上添加@Component,代表該類交於Spring容器進行維護。

固然對於自定義配置文件中的屬性值注入到對應的類屬性值中,可使用@ConfigurationProperties或者@Value註解進行屬性值注入

示例

  1. 建立test.properties

    test.id=1
    test.name=zhangsan
  2. 建立配置類

    @Data
    @Component
    // 引入自定義配置文件的名稱和位置
    @PropertySource(value = "classpath:test.properties", encoding = "UTF-8")
    @ConfigurationProperties(prefix = "test")
    public class MyProperties {
       private int id;
       private String name;
    }
  3. 測試

    // 測試啓動器,並加載Spring boot 測試註解
    @RunWith(SpringRunner.class)
    // 標記該類爲Spring boot 單元測試類,並加載項目的ApplicationContext上下文環境
    @SpringBootTest
    class SpringbootDemoApplicationTests {
       @Autowired
       private MyProperties myProperties;
       @Test
       void contextLoads() {
           System.out.println(myProperties);
       }
    }

Spring Boot 全局配置文件

2.1.6.2 @Configuration

在Spring Boot框架中,推薦使用配置類的方式向容器中配置和組件

在Spring Boot框架中,一般使用 @Configuration 註解定義一個配置類,Spring Boot 會自動掃描和識別配置類,從而替換傳統Spring框架中的XML配置文件。

當定義一個配置類後,還須要在類中的方法上使用@Bean註解進行組件配置,將方法的返回對象注入到Spring容器中,而且組件名稱默認爲方法名,固然也可使用@Bean註解的name、value屬性自定義組件的名稱。

  1. 建立Config配置類

    // 標明該類爲配置類
    @Configuration
    public class MyConfig {
       @Bean // 將返回值對象做爲組件,添加到Spring容器中,標識id默認爲方法名或者自定義@Bean(id)
       public MyService myService() {
           return new MyService();
       }
    }
  2. 測試

    // 測試啓動器,並加載Spring boot 測試註解
    @RunWith(SpringRunner.class)
    // 標記該類爲Spring boot 單元測試類,並加載項目的ApplicationContext上下文環境
    @SpringBootTest
    class SpringbootDemoApplicationTests {
       @Autowired
       private ApplicationContext applicationContext;
       @Test
       void contextLoads() {
           boolean myService = applicationContext.containsBean("myService");
           System.out.println(myService);
       }
    }

Spring Boot 全局配置文件

2.1.7 隨機數設置

在Spring Boot配置文件中,隨機值設置使用到了Spring Boot內嵌的RandomValuePropertySource類,對一些隱祕屬性值或者測試用例屬性值進行隨機值注入

隨機值設置的語法格式爲 ${random.xx},xx標識須要指定生成的隨機數類型和範圍,能夠是整數,uuid,或者字符串

@Data
@Component
@ConfigurationProperties(prefix = "myr")
public class MyRandom {

    private String secret; // 配置隨機值
    private Integer number; // 配置隨機整數
    private Long bignumber; // 配置隨機Long類型整數
    private String uuid; // 配置隨機uuid
    private int lessthanten; // 配置小於10的隨機整數
    private int range; // 配置範圍在[1024,5048]之間的隨機整數

}
myr:
  secret: ${random.value}   # 配置隨機值
  number: ${random.int}     # 配置隨機整數
  bignumber: ${random.long} # 配置隨機Long類型整數
  uuid: ${random.uuid}      # 配置隨機uuid
  lessthanten: ${random.int(10)}  # 配置小於10的隨機整數
  range: ${random.int[1024,5048]} # 配置範圍在[1024,5048]之間的隨機整數

Spring Boot 全局配置文件

2.1.8 參數間引用

在Spring Boot配置文件中,配置文件的 屬性值還能夠進行參數間的引用,也就是在後一個配置的屬性值中引用先前已經定義多的屬性,這樣就能夠直接解析其中的屬性值了。

參數間引用的語法格式:${xxx},xxx表示先前在配置文件中已經配置過的屬性名

好處:多處引用,一處配置

@Data
@Component
@ConfigurationProperties(prefix = "app")
public class App {
    private String name;
    private String describe;
}
app:
  name: 測試APP
  describe: ${app.name}是用來測試的
相關文章
相關標籤/搜索