SpringBoot--------核心配置(二)

https://i.xue.taobao.com/my/learning.htm?spm=a2174.7365761.0.0.oxhqUo

 

第2章 Spring Boot 核心配置

2.1 Spring Boot的配置文件

Spring Boot 使用一個全局配置文件,放置在 src/main/resources 目錄或類路徑的 /config 下; application.properties application.yml

配置文件的作用:修改 Spring Boot 自動配置的默認值;

yml 是 YAML(YAML Ain't Markup Language)不是一個標記語言;

標記語言:以前的配置文件;大多都使用的是 xxxxx.xml文件;

YAML:以數據爲中心,配置數據的時候具有面向對象的特徵;比 json、xml 等更適合做配置文件;

2.2 YAML語法格式

2.2.1 YAML基本語法

key: value 表示一對鍵值對(冒號後面必須要有空格)

使用空格縮進表示層級關係

左側縮進的空格數目不重要,只要同一層級的元素左側對齊即可

key 與 value 大小寫敏感

2.2.2 YAML常用寫法

2.3 yaml 配置文件注入值

1)編寫 JavaBean

2)編寫 application.yml 配置文件

3)使用 SpringBoot 單元測試類進行測試

4)導入配置文件處理器,然後重新運行測試類,在編寫配置文件時就會提示

2.4 properties 配置文件注入值

將 application.yml配置文件中的內容註釋掉,編寫application.properties 配置文件

運行後,發現 properties 文件在 idea 上中文亂碼, 進行如下設置就會不會亂碼

2.5比較 @Value 和 @ConfigurationProperties 獲取值

使用 @Value 獲取值,把 Emp 類中的 @ConfigurationProperties 註釋掉

總結 @Value 與 @ConfigurationProperties 獲取值的差異:

  @ConfigurationProperties @Value
功能 批量注入配置文件中的屬性 一個個指定
鬆散綁定(鬆散語法) 支持 不支持
SpEL  不支持 支持
JSR303數據校驗 支持 不支持
複雜類型封裝 支持 不支持


2.6 JSR303數據校驗_配置文件注入的值

@Validate註解

2.7 加載指定配置文件

2.7.1 @PropertySource 加載局部配置文件

@ConfigurationProperties 默認從全局配置文件(application.properties/application.yml)中獲取值,

所有配置數據寫在全局配置文件中,顯得太臃腫了, 可將它們抽取出來,放到其他局部配置文件中。

2.7.2 @ImportResource 使用xml配置

SpringBoot提倡零配置, 即無xml配置,但是在實際開發中,可能有一些特殊要求必須使用 xml 配置;

這時我們可以通過 Spring 提供的 @ImportResource 來加載 xml 配置文件。

2.7.3 自定義配置類向容器注入組件

2.8 Profile 多環境支持

2.8.1 Profile介紹

Profile 是 Spring 用來針對不同的環境要求,提供不同的配置支持, 全局 Profile 配置使用的文件名可以是

application-{profile}.properties / application-{profile}.yml ; 如: application-dev.properties / application-prod.properties

演示案例:我們的項目環境分爲 開發 (dev)和 生產(prod)環境 ,開發環境下端口號爲 8082,

生產環境下端口號爲8888 。

2.8.2 properties 文件演示案例

創建兩個文件 application-dev.properties 與 application-prod.properties 

激活指定profile

2.8.3 yml 文件演示案例

2.8.4 多種方式激活指定profile

2.9 配置文件加載位置

SpringBoot 啓動時,會掃描以下位置的 application.properties 或者 application.yml 文件作爲

Spring Boot的默認配置文件: 

配置文件位置

說明

file:./config/

當前項目的config目錄下(最高級別)

file:./

當前項目的根目錄下

classpath:/config/

類路徑的config目錄下

classpath:/

類路徑的根目錄下(最低級別)

以上按照優先級從低到高的順序,將所有位置的配置文件全部加載,高優先級的配置內容會覆蓋低優先級的

配置內容。

優先級由高到底,高優先級的配置會覆蓋低優先級的配置;
SpringBoot會從這四個位置全部加載主配置文件;互補配置;

==我們還可以通過spring.config.location來改變默認的配置文件位置==
項目打包好以後,我們可以使用命令行參數的形式,啓動項目的時候來指定配置文件的新位置;指定配置文件和默認加載的這些配置文件共同起作用形成互補配置;

注意:如果使用IDEA創建的項目是 Module (如果是 Project 則忽略),當前項目的根目錄不是你這個項目所

有目錄(是Project所在目錄) ,這樣使用 file: 存放配置文件時會找不到配置

解決方式:更改工作路徑直接爲Module所有目錄 $MODULE_DIR$ 

 

配置文件到底能寫什麼?怎麼寫?

配置文件能配置的屬性參照

https://docs.spring.io/spring-boot/docs/2.0.6.RELEASE/reference/htmlsingle/#common-application-properties


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

1.命令行參數

所有的配置都可以在命令行上進行指定

java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc

多個配置用空格分開; --配置項=值

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指定的默認屬性

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

注意:

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

1、配置類**@Configuration**------>Spring配置文件

2、使用**@Bean**給容器中添加組件

/**
 * @Configuration:指明當前類是一個配置類;就是來替代之前的Spring配置文件
 *
 * 在配置文件中用<bean><bean/>標籤添加組件
 *
 */
@Configuration
public class MyAppConfig {
 
    //將方法的返回值添加到容器中;容器中這個組件默認的id就是方法名
    @Bean
    public HelloService helloService02(){
        System.out.println("配置類@Bean給容器中添加組件了...");
        return new HelloService();
    }
}

 

3、配置文件佔位符

1)隨機數

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

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

 

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