① 二、SpringBoot的配置--yaml
SpringBoot使用一個全局的配置文件,配置文件名是固定的;
配置文件的作用:修改SpringBoot自動配置的默認值;SpringBoot在底層都給我們自動配置好;
YAML 是一個標記語言
標記語言:
以前的配置文件;大多都使用的是xxx.xml文件
YAML:以數據為中心,比json、xml等更適合做配置文件
YAML:配置例子
XML:
k:(空格)v : 表示一對鍵值對(空格必須有)
以空格的縮進來控制層級關系;只要是左對齊的一列數據,都是同一個層級的
屬性和值也是大小寫敏感;
k: v :字面直接來寫;
字元串默認不用加上單引號或者雙引號;
"" :雙引號;不會轉義字元串裡面的特殊字元; 特殊字元會作為本身想表示的意思
name : "zhangsan lisi" :輸出 : zhangsan 換行 lisi
'' :單引號;會轉義特殊字元,特殊字元最終只是一個普通的字元串數據
name: 'zhangsan lisi' : 輸出 ; zhangsan lisi
k: v : 在下一行來寫對象的屬性和值的關系 ;注意縮進
對象還是 k: v 的方式
行內寫法:
用- 值表示數組中的一個元素
行內寫法
配置文件
javaBean:
我們可以導入配置文件處理器,以後編寫配置就有提示了
調整 圖示:
配置文件yml還是properties他們都能獲取到值;
如果說,我們只是在某個業務邏輯中需要獲取一下配置文件中的某項值,使用@Value
如果說,我們專門編寫一個javaBean來和配置文件進行映射,我們就直接使用@ConfigurationProperties
@ImportResource:導入Spring的配置文件,讓配置文件裡面的內容生效
SpringBoot裡面沒有Spring的配置文件,我們自己編寫的配置文件,也不能自動識別;
想讓Spring的配置文件生效,載入進來;@ImportResource標注在一個配置類上
不來編寫Spring的配置文件
Spring Boot推薦給容器添加組件的方式;推薦全註解的方式
1、配置類@Configuration------>Spring配置文件
2、使用@Bean給容器中添加組件
我們在主配置文件編寫的時候,文件名可以是application-{profile}.properties/yml
默認使用application.properties的配置
1、在配置文件中指定spring.profiles.active=dev
2、在命令行:
java -jar spring-boot-02-config.jar --spring.profiles.active=dev;
可以直接在測試的時候,配置傳入命令行參數
3.虛擬機參數
-Dspring.profiles.active=dev
springboot 啟動會掃描以下位置的application.properties或者application.yml文件作為Spring Boot的默認配置文件
-file:./config/
-file:./
-classpath:/config/
-classpath:/
優先順序由高到低,高優先順序的配置會覆蓋低優先順序的配置
SpringBoot會從這四個位置載入主配置文件:互補配置
==我們還可以通過spring.config.location來改變默認的配置文件位置==
項目打包好以後,我們可以使用命令行參數的形式,啟動項目的時候來指定配置文件的新位置;指定配置文件和默認載入的這些配置文件共同起作用互補配置;
java -jar spring-boot-02-config.jar --spring.config.location=G:/application.properties
==SpringBoot也可以從以下位置載入配置;優先順序從高到低;高優先順序的配置低優先順序的配置,所有的配置會形成互補配置==
1.命令行參數
2.來自java:comp/env的JNDI屬性
3.java系統屬性
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)配置文件
精髓:
1》springboot啟動會載入大量的自動配置類
2》我們看我們需要的功能有沒有springboot默認寫好的自動配置類
3》我們再來看這個自動配置類中到底配置了那些組件;(只要我們要用的組件有,我們就不需要再來配置了)
4》給容器中自動配置類添加組件的時候,會從properties類中獲取某些屬性,我們就可以在配置文件中指定這些屬性的值
② springboot 多環境配置和切換
在實際開發中,我們往往需要用到開發,測試,生產等環境,為了方便環境的切換,springboot提供了profile功能.
profile是spring對不同壞境提供不同配置功能的支持,可以通過激活,指定參數等方式快速切換.
一共有三種方式,各位可以根據項目使用最適合自己的那一種.
第一種:配置文件激活: spring.profiles.active=dev
1,多profile文件形式----使用properties配置文件
在主配置文件編寫的時候,文件名可以是 application-{profile}.properties,如圖所示
2,多profile文檔快模式----使用yml做配置文件
可以使用yml文檔塊方法配置不同環境,比properties更簡潔方便,三條杠(---)作為分割,自定義profiles,active對應就可以了.請看具體實現.
結果是啟動項目8082埠
第二種:使用命令行激活
1,命令行 --spring.profiles.active=dev
命令行方式有兩種,一種是在IDEA中配置(eclipse中同樣位置),一種在打包後使用cmd配置
2,打包,打包過程很多同學都熟悉,這里簡單說一下,請看圖
打包成功會出現兩個以項目名開頭的文件, 右鍵其中一個文件-show in Explorer,進入文件所在目錄,在地址欄中輸入cmd,進入命令行
輸入以上命令 並Enter,就可以運行springboot,查看啟動埠號,可以看到啟動了8081.
其中spring-boot-0.0.1-SNAPSHOT.jar是你自己項目打包後的文件名,記得替換一下.
第三種:jvm參數方式激活 -Dspring.profiles.active=dev
和命令行的第一種配置在同一個地方,虛擬機配置也很簡單,請看圖片
點擊apply-ok,啟動後,使用的8081埠.
大致就是這三種激活方式,一般情況下都是使用的第一種配置文件激活,方便還不容易出錯.
③ springBoot中的application.yml配置文件
有些用過springBoot工程的人總有疑惑,springBoot工程中是有一個application.yml配置文件的啊,其實application.yml的功能和application.properties是一樣的,不過因為yml文件是樹狀結構,寫起來有更好的層次感,更易於理解,所以很多人都選擇了yml文件。
下面來說說將工程改成application.yml配置文件的詳細步驟
第一步:在 application.properties 文件的同級目錄下新建一個 application.yml 文件
第二步:添加application.yml文件中的配置如下:
server:
port: 8088
spring:
datasource:
name: test
url: jdbc:mysql://localhost:3306/test
username: root
password: xxx
# 使用druid數據源
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
filters: stat
maxActive: 20
initialSize: 1
maxWait: 60000
minIdle: 1
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxOpenPreparedStatements: 20
如圖所示:
第三步:刪除原有的application.properties文件
文件結構如圖示:
第四步,重新編譯maven工程
找到maven工具欄,雙擊clean,待執行完成後,雙擊install,執行完成則編譯成功。
第四步,重啟springboot項目
沒有任何問題:
The End
④ SpringBoot的自定義配置
SpringBoot免除了項目中大部分的手動配置,對一些特定情況,我們可以通過修改全局配置文件以適應具體生產環境,可以說,幾乎所有的配置都可以寫在application.properties文件中,SpringBoot會自動載入全局配置文件,從而免除我們手動載入的煩惱。但是,如果我們自定配置文件,SpringBoot是無法識別這些配置文件的,此時就需要我們手動載入。接下來,將針對SpringBoot的自定義配置文件及其載入方式進行講解。
對於這種載入自定義配置文件的需求,可以使用@PropertySource註解結合@Configuration註解配置類的方式來實現。@PropertySource註解用於指定自定義配置文件的具體位置和名稱。同時,為了保證SpringBoot能夠掃描該註解,還需要類添加@Configuartion註解將實體類作為自定義配置類。
當然,如果需要將自定義配置文件中的屬性值注入到對應類的屬性中,可以使用@ConfigurationProperties或者@Value註解進行屬性值注入
打開SpringBoot項目的resources目錄,在項目的類路徑下新建一個test.properties自定義配置文件,在該配置文件中編寫需要的配置屬性
在com.david.pojo包下新創建一個配置類MyProperties,提供 test.properties 自定義配置文件中對應的屬性,並根據@PropertySource註解的使用進行相關配置
主要是一個自定義配置類,通過相關註解引入了自定的配置文件,並完成了自定義屬性值的注入。針對示例中的幾個註解,具體說明如下:
1)@Confiruation註解表示當前類是一個自定義配置類,並添加為Spring容器的組件,這里也可以使用傳統的@Component註解
2)@PropertySource("classpath:properties")註解指定了自定義配置文件的位置和名稱,此示例表示自定義配置文件為classpath類路徑下的 test.properties 文件
3)@ConfigurationProperties(prefix="test")註解將上述自定義配置文件 test.properties 中以test開頭的屬性值注入到該配置類屬性中
4)如果配置類上使用的是@Componnet註解而非@Configuration註解,那麼@EnableConfigurationProperties註解還可以省略
在SpringBoot框架中,推薦使用配置類的方式向容器中添加和配置組件
在SpringBoot框架中,通常使用@Configuration註解定義一個配置類,SpringBoot會自動掃描和識別配置類,從而替換傳統Spring框架中的XML配置文件。
當定義一個配置類後,還需要在類中的方法上使用@Bean註解進行組件配置,將方法的返回對象注入到Spring容器中,並且組件名稱默認使用的是方法名,當然也可以使用@Bean註解的name或value屬性自定義組件的名稱
在項目下新建一個
⑤ springbootweb項目中修改伺服器埠的配置屬性是
一、修改默認配置
例1、spring boot 開發web應用的時候,默認tomcat的啟動埠為8080,如果需要修改默認的埠,則需要在application.properties 添加以下記錄:
server.port=8888
二、自定義屬性配置
在application.properties中除了可以修改默認配置,我們還可以在這配置自定義的屬性,並在實體bean中載入出來。
1、在application.properties中添加自定義屬性配置
com.sam.name=sam
com.sam.age=11
com.sam.desc=magical sam
2、編寫Bean類,載入屬性
Sam類需要添加@Component註解,讓spring在啟動的時候掃描到該類,並添加到spring容器中。
第一種:使用spring支持的@Value()載入
package com.sam.demo.conf;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* @author sam
* @since 2017/7/15
*/
@Component
public class Sam {
//獲取application.properties的屬性
@Value("${com.sam.name}")
private String name;
@Value("${com.sam.age}")
private int age;
@Value("${com.sam.desc}")
private String desc;
//getter & setter
}
第二種:使用@ConfigurationProperties(prefix="") 設置前綴,屬性上不需要添加註解。
package com.sam.demo.conf;
import org.springframework.stereotype.Component;
/**
* @author sam
* @since 2017/7/15
*/
@Component
@ConfigurationProperties(prefix = "com.sam")
public class Sam {
private String name;
private int age;
private String desc;
//getter & setter
}
三、自定義配置類
在Spring Boot框架中,通常使用@Configuration註解定義一個配置類,Spring Boot會自動掃描和識別配置類,從而替換傳統Spring框架中的XML配置文件。
當定義一個配置類後,還需要在類中的方法上使用@Bean註解進行組件配置,將方法的返回對象注入到Spring容器中,並且組件名稱默認使用的是方法名,
這里使用DataSource舉例
package com.example.demo.config;
import javax.sql.DataSource;
@Slf4j
@Configuration
@EnableConfigurationProperties(JdbcPro.class)
public class DataSouce1Config {
@Value("${my.name}")
private String name ;
@Value("${spring.datasource.url}")
private String dbUrl;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@Value("${spring.datasource.driver-class-name}")
private String driverClassName;
@Bean
@Primary
public DataSource dataSource(){
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setUrl(this.dbUrl);
druidDataSource.setUsername(username);
druidDataSource.setPassword(password);
druidDataSource.setDriverClassName(driverClassName);
log.info("cccccccccccccccc");
log.info(this.name);
return druidDataSource;
}
}
Spring Boot 屬性配置&自定義屬性配置
⑥ SpringBoot 配置文件詳解(告別XML)
快速學會和掌握 SpringBoot 的 核心配置文件的使用。
SpringBoot 提供了豐富的 外部配置 ,常見的有:
其中核心配置文件我們並不陌生,主要以Key-Value的形式進行配置,其中屬性Key主要分為兩種:
在 application.properties 添加配置如下:
① 添加數據源信息
在 application.propertis 添加配置如下:
① 添加認證信息,其中 socks.indentity.* 是自定義的屬性前綴。
② 添加隨機值,其中spring.test.* 是自定義的屬性前綴。
使用方法: @ConfigurationProperties(prefix = "spring.datasource")
使用說明:提供 Setter方法 和 標記組件 Component
如何驗證是否成功讀取配置?答:這里可以簡單做個驗證,注入 MyDataSource ,使用 Debug 模式可以看到如下信息:
使用方法: @Value("spring.datasource.*")
使用說明:提供 Setter方法 和 標記組件 Component
注意事項:@Value不支持注入靜態變數,可間接通過Setter注入來實現。
關於兩者的簡單功能對比:
顯然,前者支持松綁定的特性更強大,所以在實際開發中建議使用@ConfigurationProperties來讀取自定義屬性。
SpringBoot 默認會載入這些路徑載入核心配置文件,按優先順序從高到低進行排列:具體規則詳見 ConfigFileApplicationListener
如果存在多個配置文件,則嚴格按照優先順序進行覆蓋,最高者勝出:
舉個簡單的例子,例如再上述位置都有一個application.properties ,並且每個文件都寫入了server.port=xx (xx分別是9001,9002,9003,9004),在啟動成功之後,最終應用的埠為:9004。圖例:
如果想修改默認的載入路徑 或者 調改默認的配置文件名,我們可以藉助命令行參數進行指定,例如:
YAML是JSON的一個超集,是一種可輕松定義層次結構的數據格式。
答: 因為配置文件這東西,結構化越早接觸越規范越好。這里推薦閱讀阮一峰老師寫的 YAML語言教程 ,寫的很簡單明了。
引入依賴: 在POM文件引入 snakeyaml 的依賴。
使用說明: 直接在類路徑添加 application.yml 即可。
例如下面這兩段配置是完全等價的:
① 在 application.yml 配置數據源:
② 在 application.properties 配置數據源:
在項目的實際開發中,我們往往需要根據不同的環境來載入不同的配置文件。例如生產環境,測試環境和開發環境等。此時,我們可以藉助 Profiles 來指定載入哪些配置文件。例如:
溫馨提示:如果spring.profiles.active指定了多個配置文件,則按順序載入,其中最後的優先順序最高,也就是最後的會覆蓋前者。
使用方法:
使用Maven插件打包好項目,然後在當前路徑,執行DOS命令: java -jar demo.jar --server.port=8081 ,在控制台可看到應用埠變成了8081。
實現原理:
默認情況下,SpringBoot會將這些命令行參數轉化成一個 Property ,並將其添加到 Environment 上下文。
溫馨提示:
由於命令行參數優先順序非常之高,基本高於所有常見的外部配置,所以使用的時候要謹慎。詳見 PropertySource 執行順序 。
關閉方法:
如果想禁用命令行屬性,可以設置如下操作:springApplication.setAddCommandLineProperties(false)
⑦ Springboot配置文件讀取-ConfigFileApplicationListener
ConfigFileApplicationListener 主要作用就是讀取應用的配置文件並add到Environment的PropertySources列表裡
Springboot應用在啟動的時候准備好了環境後就會觸發 事件就開始執行讀取配置的邏輯:
首先載入當前激活的Profile列表
然後從默認的 classpath:/,classpath:/config/,file:./,file:./config/ 這四個目錄下
查找默認的application-{profile}名字對應的配置文件,配置文件格式支持兩大類(Properties和Yaml)既:.properties .xml .yml .yaml
可以修改默認的配置文件名字(默認:application),可以指定多個比如 --spring.config.name= application,demo
可以修改默認的配置文件路徑,比如 --spring.config.location= file:///C:/config/ (目錄結尾不帶「/」會按照文件處理,而不是目錄,容易掉坑)
閱讀源碼入口就從他的onApplicationEvent開始跟即可,將自身添加到postProcessor列表裡並執行postProcessEnvironment方法,核心邏輯是靠一個Loader內部類
new Loader(environment, resourceLoader).load()
大概就是,如果沒有spring.profiles.active 和 spring.profiles.include都沒有特別指定激活的profile的話
沒有特別指定profile的話就是:null + default,也就是我們常見的application.properties 和 application-default.properties這種
如果指定了那就是:null + 已經激活(pre-existing)的profile + spring.profiles.active + spring.profiles.include
舉個例子,假如激活了多個profile比如:--spring.profiles.active=prd1,prd2,最終優先順序上prd1 > prd2 > default(null)
⑧ Springboot 使用@RefreshScope 註解,實現配置文件的動態載入
實現配置文件動態讀取的好處不必多說,修改配置文件後不必重啟Application ,想想就開心。
合格調包俠的必備技能,從Maven倉庫引入依賴的Jar包,
搞好配置文件,默認在application.yml /properties 就行,與本功能相關的配置項(採用yml格式)如下:
distributed-id是自定義需要動態部署的配置文件。management:是暴露refresh介面,不加此條配置將無法啟用動態載入配置文件的功能(也就是管你理解不理解,別問,加就對了)。
1.編寫自定義配置文件的Java對象,一定要在類上加@RefreshScope註解
@data是lombok的註解,別的註解不多說。
2.編寫你的conroller ,也一定要加@RefreshScope註解, 不加的話,呵呵,對不起,無法運行。。原因嗎---在這 @RefreshScope not working - Spring Boot - Stack Overflow
我這里是返回配置文件中distributed-id.mechineId的值。
3.到此為止了,簡單吧😒。其實的話,第一步也可以直接在Bean的配置中心(也就是@Configuration註解的類)搞一下,效果是一樣的。
使用這種寫法,就可以不用在配置對象類上加@Component和@RefreshScope。
測試一下啦,啟動應用前,將配置文件設置如下:
運行程序後,在瀏覽器輸入你的測試地址,返回如下,是5沒錯了:
然後找到你編譯後文件,修改配置文件的值,注意是 編譯後的配置文件 就是下圖中灰色文件的位置
修改如下:mechineId修改為4
接下來向 http://localhost:port/actuator/refresh 發送 POST 請求,get請求是無法識別的呦😘,可以看到返回了配置文件中被更改的屬性
測試一下,沒錯了,返回值為4
⑨ 如何修改spring boot應用程序的配置文件
Spring Boot 是 Spring 產品中一個新的子項目,致力於簡便快捷地搭建基於 Spring 的獨立可運行的應用。大多數的 Spring Boot 應用只需要非常少的 Spring 配置。 你能夠使用 Spring Boot 創建 Java 應用並通過 java -jar 來運行或者創建傳統的通...
⑩ springboot配置文件總結
springboot 本身支持多種靈活的配置方式,為開發 springboot 程序帶來了很大的靈活性和擴展性,但是同時由於太靈活,經常會導致明明配置了相關屬性,卻沒有生效。
本文總結了 springboot 配置文件的原理以及多個配置文件生效的順序。
springboot 配置文件支持靈活的路徑,以及靈活的文件名,用一個變數表達式總結如下:
部分源碼如下:
當滿足上述變數表達式的配置文件有多個時,會有一個配置的優先順序。假設
上面每個條件組合起來,則最多有配置文件如下,且順序從上到下:
獲取屬性時,按從上到下的順序遍歷由上述文件生成的屬性資源對象 PropertySource ,如果遇到匹配的key直接返回。
總結一下:就是如果同一個key的屬性只出現一次,則直接取該值即可。如果同一個key的屬性出現多次,則取順序靠前的屬性資源對象。另外其中每個文件都是可選的。
需要注意的一點是:如果在同一個 location 下配置了多個文件名一樣的文件,則只會取一個,比如在 classpath:/ ,有如下兩個文件 application.yml :
則只會根據 classloader 的 classpath 列表,選取第一個出現的文件。因為 springboot 載入配置文件時最底層是使用的下面的方法:
這兩個方法只會獲取 classloader 類的 ucp 屬性裡面第一個匹配到的值。如果對 springboot 自身的機制不滿意,想獲取所有的classpath:/路徑下面的 applicaiton.yml 文件,可以使用下面的方法:
本文總結了 springboot 配置文件的原理以及多個配置文件生效的順序。如果存在增加了配置文件或者在配置文件裡面增加了屬性卻沒有生效,可以參考上面的 springboot 配置文件表達式和配置文件生效順序進行排查。
後面還會有一篇文章討論基於 springboot 配置原理如何實現自定義的配置讀取方式。