Spring Boot配置

配置文件

  • SpringBoot使用一個全局的配置文件,配置文件名是固定的
    • application.properties
    • application.yml 需要自己創建
      • YAML(YAML Ain't Markup Language):以數據爲中心,比json、xml等更適合做配置文件
      • 標記語言:
        • 以前的配置文件,大多都使用的是 xxxx.xml文件
  • 配置文件的作用:修改SpringBoot自動配置的默認值,SpringBoot在底層都給我們自動配置好

YAML語法

  • 基本語法
    • k:(空格)v:表示一對鍵值對(空格必須有)
    • 空格的縮進來控制層級關係,只要左對齊的一列數據都是同一層級的
    • 屬性和值也是大小寫敏感
  • 值的寫法
    • 字面量:普通的值(數字,字符串,布爾)
      • k: v:字面值直接寫【字符串默認不加單引號或者雙引號】
        • ""雙引號:不會轉義字符串裏面的特殊字符,特殊字符會作爲本身想表示的意思
          • name: "zhangsan \n lisi",輸出:zhangsan 換行 lisi
        • ''單引號:會轉義特殊字符,特殊字符最終只是一個普通的字符串數據
          • name: 'zhangsan \n lisi',輸出:zhangsan \n lisi
    • 對象、Map(屬性和值)(鍵值對)
      • k: v:在下一行來寫對象的屬性和值的關係,注意縮進
        • 對象還是k: v的方式
        • 行內寫法:
    • 數組(List、Set)
      • 用- 值表示數組的一個元素
      • 行內寫法:

配置文件值注入

  • 配置文件:
  • JavaBean:
  • 我們可以導入配置文件處理器,以後編寫配置就有提示了
    • <!--導入配置文件處理器,配置文件進行綁定就會有提示-->
      <dependency>
      	<groupId>org.springframework.boot</groupId>
      	<artifactId>spring-boot-configuration-processor</artifactId>
      	<optional>true</optional>
      </dependency>
  • properties配置文件在idea中默認utf-8可能會亂碼

    • 在 application.properties 進行配置

    • 運行得到的lastName是亂碼

    • 進入設置,搜索File Encodings

    • 再次運行

  • @Value獲取值

  • @Value獲取值和@ConfigurationProperties獲取值比

    • @ConfigurationProperties(prefix = "person"):默認從全局配置文件中獲取值
    •   @ConfigurationProperties @Value
      功能 批量注入配置文件中的屬性 一個個指定
      鬆散綁定(鬆散語法) 支持 不支持
      SpEL 不支持 支持
      JSR303數據校驗 支持 不支持
      複雜類型封裝 支持 不支持(只能取基本數據類型)
    • 注意:JSR303數據校驗
    • 總結:
      • 配置文件yml還是properties他們都能獲取到值

      • 如果說,我們只是在某個業務邏輯中需要獲取一下配置文件中的某項值,使用@Value

      • 如果說,我們專門編寫了一個javaBean來和配置文件進行映射,我們就直接使用@ConfigurationProperties​

  • @PropertySource&@ImportResource&@Bean

    • @PropertySource:加載指定的配置文件

    • @ImportResource:導入Spring的配置文件,讓配置文件裏面的內容生效

      • Spring Boot裏面沒有Spring的配置文件,我們自己編寫的配置文件(xxx.xml),也不能自動識別

      • 如果想讓Spring的配置文件生效,加載進來,則需要@ImportResource標註在一個配置類上

    • SpringBoot推薦給容器中添加組件的方式,推薦使用全註解的方式

      • 配置類@Configuration------>Spring配置文件

      • 使用@Bean給容器中添加組件【如果下面代碼的方法名不爲helloService那麼就沒有添加成功】

配置文件佔位符

  • 隨機數

    • ${random.value}、${random.int}、${random.long}、${random.int(10)}、${random.int[1024,65536]}

  • 佔位符獲取之前配置的值,如果沒有可以是用:指定默認值

    • 下圖中:person.hello:hello ,表示如果沒有person.hello那麼默認是hello,如果沒有後邊那個hello則顯示${person.hello}_dog

Profile

  • 介紹:

    • Profile是Spring對不同環境提供不同配置功能的支持,可以通過激活、指定參數等方式快速切換

  • 多Profile文件

    • 我們在主配置文件編寫的時候,文件名可以是 application-{profile}.properties/yml

    • 創建多個properties文件時,默認使用的是application.properties

  • yml支持多文檔塊方式

  • 激活指定profile

    • 方式1:

      • 創建多個properties文件,需要用哪個則需要在application.properties中寫一行代碼

    • 方式2:

      • java -jar 對應程序的jar包 --spring.profiles.active=dev

      • 可以直接在測試的時候,配置傳入命令行參數【--spring.profiles.active=dev】

    • 方式3:

      • 虛擬機參數【-Dspring.profiles.active=dev

配置文件加載位置

  • springboot 啓動會掃描以下位置的application.properties或者application.yml文件作爲Spring boot的默認配置文件
  • 以上是按照優先級從高到低的順序,所有位置的文件都會被加載,高優先級配置內容會覆蓋低優先級配置內容
  • 例子:
    • 根據上述,紅框的properties的優先級最高,然後是綠框,然後是黃框
    • 紅框表示:-file:./
    • 綠框表示:-classpath:/config/
    • 黃框表示:-classpath:/
  • 我們也可以通過配置spring.config.location來改變默認配置
    • 方式一:這種指定配置文件路徑的方式是不對的
      • 在本地路徑下配置一個properties,然後在代碼中的properties引用本地路徑下的properties
    • 方式二:使用運維的方式
      • 項目打包好以後,我們可以使用命令行參數的形式,啓動項目的時候來指定配置文件的新位置,指定配置文件和默認加載的這些配置文件共同起作用形成互補配置
      • java -jar jar包 --spring.config.location=G:/application.properties

外部配置加載順序

  • SpringBoot也可以從以下位置加載配置,優先級從高到低,高優先級的配置覆蓋低優先級的配置,所有的配置會形成互補配置
    • 命令行參數
      • 所有的配置都可以在命令行上進行指定
      • java -jar jar包 --server.port=8087 --server.context-path=/abc
      • 多個配置用空格分開, --配置項=值
    • 來自java:comp/env的JNDI屬性
    • Java系統屬性(System.getProperties())
    • 操作系統環境變量
    • RandomValuePropertySource配置的random.*屬性值
    • 由jar包向jar包進行尋找 ​​​​​​
    • 優先加載帶profile
      • jar包外部的application-{profile}.properties或application.yml(帶spring.profile)配置文件
      • jar包內部的application-{profile}.properties或application.yml(帶spring.profile)配置文件
    • 再來加載不帶profile
      • jar包外部的application.properties或application.yml(不帶spring.profile)配置文件
      • jar包內部的application.properties或application.yml(不帶spring.profile)配置文件
    • @Configuration註解類上的@PropertySource
    • 通過SpringApplication.setDefaultProp
  • 參考官方文檔:外部配置加載順序

自動配置原理

  • 裝配文件能配置的屬性屬性參照鏈接
  • 自動裝配原理:SpringBoot自動裝配原理詳解
  • 精髓:
    • ​​​​​​​SpringBoot啓動會加載大量的自動配置類
    • 我們看我們需要的功能有沒有SpringBoot默認寫好的自動配置類
    • 我們再來看這個自動配置類中到底配置了哪些組件;(只要我們要用的組件有,我們就不需要再來配置了
    • 給容器中自動配置類添加組件的時候,會從properties類中獲取某些屬性。我們就可以在配置文件中指定這些屬性的值
      • ***AutoConfigurartion:自動配置類
      • 給容器添加組件
      • ***Properties:封裝配置文件中的相關屬性

細節

  • @Conditional派生註解

    • ​​​​​​​作用:必須是@Conditional指定的條件成立,纔給容器中添加組件,配置配裏面的所有內容才生效

  • @Conditional擴展註解 作用(判斷是否滿足當前指定條件)
    @ConditionalOnJava 系統的java版本是否符合要求
    @ConditionalOnBean 容器中存在指定Bean;
    @ConditionalOnMissingBean 容器中不存在指定Bean;
    @ConditionalOnExpression 滿足SpEL表達式指定
    @ConditionalOnClass 系統中有指定的類
    @ConditionalOnMissingClass 系統中沒有指定的類
    @ConditionalOnSingleCandidate 容器中只有一個指定的Bean,或者這個Bean是首選Bean
    @ConditionalOnProperty 系統中指定的屬性是否有指定的值
    @ConditionalOnResource 類路徑下是否存在指定資源文件
    @ConditionalOnWebApplication 當前是web環境
    @ConditionalOnNotWebApplication 當前不是web環境
    @ConditionalOnJndi JNDI存在指定項
  • 自動配置類必須在一定的條件下才能生效

  • 我們怎麼知道哪些自動配置類生效?

    • ​​​​​​​我們可以通過啓用 debug=true屬性;來讓控制檯打印自動配置報告==,這樣我們就可以很方便的知道哪些自動配置類生效
    • 之後再運行程序,控制檯就會將用到的配置類進行打印
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章