SpringBoot_02 — 配置文件(yaml語法、配置文件的注入、配置文件佔位符、profile生產環境的選擇和激活、配置文件加載順序)


歡迎訪問筆者個人技術博客:http://rukihuang.xyz/

二、配置文件

2.1 配置文件

  • SpringBoot使用一個全局配置文件,配置文件名是固定

    • application.properties
    • application.yml
  • 作用:由於SpringBoot在底層已經幫助我們自動配置了,而配置文件則幫助修改SpringBoot自動配置的默認值。

2.2 YAML語法

2.2.1 基本語法

  • k: v:表示一對鍵值對(空格必須有)
    • 以空格的縮進來控制層級關係,只要左對齊的一列數據,都是同一個層級的
    • 屬性和值都是大小寫敏感的
person:
  name: 張帥
  age: 18
  birth: 1998/12/01
  boss: false
  friends:
    - 張三
    - 李四
    - 王五
  map:
    k1: v1
    k2: v2
  pet:
    name: doggy
    age: 2

2.2.2 值的寫法

2.2.2.1 普通的值(數字、字符串、布爾)

  • k: v:字面直接來寫
  • 字符串默認不用加上單引號或雙引號
    • "":雙引號,不會轉義(有特殊)字符串裏面的特殊字符;特殊字符會作爲本身想表示的意思
      • name: "zhangsan \n lisi":輸出爲zhangsan 換行 lisi
    • '':單引號,會轉義特殊字符,特殊字符最終只是一個普通的字符串數據
      • name: 'zhangsan \n lisi':輸出爲zhangsan \n lisi

2.2.2.2 對象、Map(屬性和值、鍵值對)

  • 對象還是k: v的方式
person:
  map:
    k1: v1
    k2: v2
  pet:
    name: doggy
    age: 2
  • 行內寫法
pet: {name: doggy, age: 2}

2.3 配置文件注入

  • 配置文件:application.yaml
person:
  name: 張帥
  age: 18
  birth: 1998/12/01
  boss: false
  friends:
    - 張三
    - 李四
    - 王五
  map:
    k1: v1
    k2: v2
  pet:
    name: doggy
    age: 2
  • javaBean:Person
/**
 * 將配置文件中配置的每一個屬性的值,映射到這個組件中
 * @ConfigurationProperties:告訴SpringBoot將本類中的所有屬性和配置文件中相關的配置進行綁定;
 *      prefix = "person":配置文件中哪個下面的所有屬性進行一一映射
 *
 * 只有這個組件是容器中的組件,才能容器提供的@ConfigurationProperties功能;
 *
 */
@Component //註解表明一個類會作爲組件類,並告知Spring要爲這個類創建bean
@ConfigurationProperties(prefix = "person")
public class Person {
    private String name;
    private int age;
    private Date birth;
    private boolean boss;
    private List<String> friends;
    private Map<String, String> map;
    private Dog pet;
  • @Component@Bean的區別

    • @Component註解表明一個類會作爲組件類,並告知Spring要爲這個類創建bean。
    • @Bean註解告訴Spring這個方法將會返回一個對象,這個對象要註冊爲Spring應用上下文中的bean。通常方法體中包含了最終產生bean實例的邏輯。
  • 在pom文件中添加依賴,編寫配置就會有提示

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

2.3.1 @Value獲取值和@ConfigurationProperties獲取值比較

@ConfigurationProperties @Value
功能 批量注入配置文件中的屬性 一個個指定
鬆散綁定(鬆散語法) 支持 不支持
SpEL 不支持 支持
JSR303數據校驗 支持 不支持
複雜類型封裝 支持 不支持
  • yml和properties文件都能獲取到值
    • 如果只需要獲取配置文件中的某個單個的值,使用@Value
    • 如果專門編寫了javaBean來和配置文件進行映射,使用@ConfigurationProperties

2.3.2 配置文件注入值數據校驗 @Validated

@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {

    /**
     * <bean class="Person">
     *      <property name="lastName" value="字面量/${key}從環境變量、配置文件中獲取值/#{SpEL}"></property>
     * <bean/>
     */

   //lastName必須是郵箱格式
    @Email
    //@Value("${person.last-name}")
    private String lastName;
    //@Value("#{11*2}")
    private Integer age;
    //@Value("true")
    private Boolean boss;

    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
  • 加入@Validated註解後,可以使用格式註解,對注入的數據進行校驗

2.3.3 @PropertySource/@ImportResource/@Bean

  • @PropertySource:加載指定的配置文件
@Component
@PropertySource(value = {"classpath:person.properties"})
@ConfigurationProperties(prefix = "person")
public class Person {
    private String name;
    private int age;
    private Date birth;
    private boolean boss;
    private List<String> friends;
    private Map<String, String> map;
    private Dog pet;
person.name=張三
person.age=18
person.boss=false
person.birth=1998/2/5
person.friends=a,b,c
person.map.k1=v1
person.map.k2=v2
person.pet.name=doggy
person.pet.age=2
  • @ImportResource:導入spring的配置文件,讓配置文件中的內容生效,且必須標註砸一個配置類上(@Configuration
@ImportResource(locations = {"classpath:beans.xml"})
@SpringBootApplication
public class SpringBootPrac02Application {
<!--bean.xml-->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="helloService" class="com.ruki.springboot.service.HelloService"></bean>
</beans>
  • SpringBoot推薦使用全註解方式給容器添加組件
    • @Configuration配置類:Spring配置文件
    • @Bean給容器中添加組件
/**
 * @Configuration:指明當前類是一個配置類;就是來替代之前的Spring配置文件
 *
 * 在配置文件中用<bean><bean/>標籤添加組件
 *
 */
@Configuration
public class MyAppConfig {

    //將方法的返回值添加到容器中;容器中這個組件默認的id就是方法名
    @Bean
    public HelloService helloService02(){
        System.out.println("配置類@Bean給容器中添加組件了...");
        return new HelloService();
    }
}

2.4 配置文件佔位符

2.4.1 隨機數

  1. ${random.value}
  2. ${random.int}
  3. ${random.long}
  4. ${random.int(10)}
  5. ${random.int[1024,65536]}

2.4.2 獲取之前配置的值

  • 如果沒有可以指定默認值
person.last-name=張三${random.uuid}
person.age=${random.int}
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
person.dog.name=${person.hello:hello}_dog
person.dog.age=15

2.5 Profile

  • 實際開發中存在多種環境
    • dev:開發
    • prod:生產
    • test:測試

2.5.1 多profile文件

  • 因此主配置文件會隨着不同的生產環境而產生多個文件
    • application-{profile}.properties

2.5.2 yml支持多文檔塊的方式

  • 使用三條短線---分隔文檔塊
server:
  port: 8081
spring:
  profiles:
    active: prod #激活prod生產環境,因此端口爲8084

---
server:
  port: 8083
spring:
  profiles: dev


---

server:
  port: 8084
spring:
  profiles: prod  #指定屬於哪個環境

2.5.4 激活指定profile

  1. 在配置文件中指定spring.profiles.active=dev
  2. 命令行:在最後加上--spring.profiles.active=dev
java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;
  1. 虛擬機參數 vmoption:-Dspring.profiles.active=dev

2.6 配置文件加載順序

  • springboot啓動會掃描一下位置的application.propertiesapplication.yml文件作爲默認配置文件
位置 描述 優先級
file:./config/ 工程項目/config
file:./ 工程項目 較高
classpath:/config/ resources/config 較低
classpath:/ resources
  • 優先級由高到底,高優先級的配置會覆蓋低優先級的配置;

  • SpringBoot會從這四個位置全部加載主配置文件;互補配置

2.7 外部配置加載順序

  • SpringBoot也可以從以下位置加載配置; 優先級從高到低;高優先級的配置覆蓋低優先級的配置,所有的配置會形成互補配置

    1. 命令行參數:所有的配置都可以在命令行上進行指定

      1. java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc
      2. 多個配置用空格分開; --配置項=值
    2. 來自java:comp/env的JNDI屬性

    3. Java系統屬性(System.getProperties())

    4. 操作系統環境變量

    5. RandomValuePropertySource配置的random.*屬性值

由jar包外向jar包內進行尋找;

優先加載帶profile

6.jar包外部的application-{profile}.properties或application.yml(帶spring.profile)配置文件

7.jar包內部的application-{profile}.properties或application.yml(帶spring.profile)配置文件

再來加載不帶profile

8.jar包外部的application.properties或application.yml(不帶spring.profile)配置文件

9.jar包內部的application.properties或application.yml(不帶spring.profile)配置文件

​ 10.@Configuration註解類上的@PropertySource

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

所有支持的配置加載來源;

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