配置文件
- 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屬性;來讓控制檯打印自動配置報告==,這樣我們就可以很方便的知道哪些自動配置類生效
- 之後再運行程序,控制檯就會將用到的配置類進行打印