springboot的Profile
★ 何謂Profile
應(yīng)用所在的運行環(huán)境發(fā)生切換時,配置文件常常就需要隨之修改。
Profile:——就是一組配置文件及組件的集合。
可以整個應(yīng)用在不同的profile之間切換(設(shè)置活動profile),整個應(yīng)用都將使用該profile對應(yīng)的配置文件及組件。
——每個運行環(huán)境(開發(fā)、測試、上線)都配置成一個對應(yīng)profile,這樣以后只要修改一下活動profile,
應(yīng)用就可以輕易地在不同的運行環(huán)境之間自由切換。
就是通過 配置的 profile 快速切換開發(fā)環(huán)境。
▲ 1. 聲明Profile
- @Profile修飾Spring組件(@Component、@Configuration、@ConfigurationProperties),
意味著該組件僅對特定profile有效。
- 在配置文件中添加profile名,意味著該配置文件僅對特定profile生效。
- 多profile的配置文件。
▲ 2. 設(shè)置活動Profile
spring.profiles.active屬性指定激活哪個Profile
——該屬性可通過任意的外部配置源來指定。
★ 通用配置文件 和 Profile特定的配置文件 的區(qū)別
通用配置文件: application.properties或者application.yml
profile相關(guān): application-{profile名}.properties或者application-{profile名}.yml
profile相關(guān)的配置文件的優(yōu)先級更高(后加載,后加載的會覆蓋前面加載的)
就是我們要弄一個叫 abc.profile 的配置文件,那么就可以這樣寫 application-abc.properties/yml
(中劃線 - 加上 profile 名字)
代碼演示:
演示如何通過profile配置文件,來快速切換開發(fā)環(huán)境。
步驟:
1、
添加一個正式環(huán)境用的yml----application-dev.yml,寫對應(yīng)的正式環(huán)境配置
添加一個測試環(huán)境用的yml----application-test.yml,寫對應(yīng)的測試環(huán)境配置
一個原本有的通用的application.yml—用來切換開發(fā)環(huán)境和測試環(huán)境
演示通過 application.yml 配置文件中,通過指定對應(yīng)的 profile 名字,來切換開發(fā)環(huán)境
演示 用 java 類來查看
類用 @Profile 注解 來修飾
@Profile(“dev”) //注解作用:表示這個控制器僅對dev作為活動profile時才生效(就是把開發(fā)環(huán)境切換成 dev ,這個控制器才生效)
application.yml配置文件中使用 spring.profiles.active 屬性,用于切換活動profile,意味著最終最多時能有一個活動profile,就是最終只能有一個開發(fā)環(huán)境,要么正式,要么測試,要么其他,只能有一個開發(fā)環(huán)境。
但是如果在application.yml 配置文件中,使用 spring.profiles.include屬性 用于添加活動profile,意味著最終可能有多個活動profile,目前來看是多個profile修飾的controller生效。
一開始我以為是多個開發(fā)環(huán)境生效,比如正式環(huán)境和測試環(huán)境都生效,后面發(fā)現(xiàn)是覆蓋的關(guān)系,看起來還是只有一個開發(fā)環(huán)境
新增的活動profile -> add 和 原來的活動profile -> dev ,其實它們會覆蓋,但是具體誰覆蓋誰,是不確定的。
下面演示添加活動profile
★ 添加活動Profile
▲ spring.profiles.include - 添加新的活動profile
原有的,繼續(xù)生效。
沒有的,新增。
相同的,覆蓋——Spring Boot并不確定使用新增profile覆蓋原有的profile
▲ 調(diào)用SpringApplication的setAdditionalProfiles()來添加新的活動Profile
通過添加活動Profile,實際上就相當(dāng)于讓應(yīng)用有了多個活動Profile。
【備注】:
spring.profiles.active屬性用于切換活動profile,意味著最終最多時能有一個活動profile
spring.profiles.include屬性用于添加活動profile,意味著最終可能有多個活動profile
如果在application.yml 配置文件中,使用 spring.profiles.include屬性 用于添加活動profile,意味著最終可能有多個活動profile,目前來看是多個profile修飾的controller生效。
一開始我以為是多個開發(fā)環(huán)境生效,比如正式環(huán)境和測試環(huán)境都生效,后面發(fā)現(xiàn)是覆蓋的關(guān)系,看起來還是只有一個開發(fā)環(huán)境
新增的活動profile -> add 和 原來的活動profile -> dev ,其實它們會覆蓋,但是具體誰覆蓋誰,是不確定的。
代碼示例:
添加一個活動profile
2、使用這個新添加的活動profile,有兩種方式:
方式1:在啟動類添加,用 ctx.setAdditionalProfiles(“add”); 方法
方式2:在 application.yml 配置文件中添加,用 spring.profiles.include 屬性
執(zhí)行結(jié)果
application.yml 配置文件啟動的profile 有 dev 和 add 兩個開發(fā)環(huán)境,啟動后使用的端口號是 add 的 8085
訪問結(jié)果測試:
可以看出 當(dāng) application.yml 指定了 dev 和 add 兩個開發(fā)環(huán)境后,只有 dev 和 add 兩個controller 生效(生效:能訪問到對應(yīng)的被profile注解修飾的controller的方法),
但是開發(fā)環(huán)境是 add 覆蓋了 dev 。
而test 開發(fā)環(huán)境 和 controller 都沒生效。
★ Profile組
Profile組可以讓一個應(yīng)用里面有多個profile
Profile組也是一個Profile,但該Profile可包含另外幾個Profile。例如:
spring.profiles.group.prod[0]=banner
spring.profiles.group.prod[1]=server
上面定義了一個Profile組:prod,該組包含banner和server兩個Profile。
因此如果將上面prod設(shè)為活動Profile,那就意味著項目中有3個活動profile,依次是prod、banner、server
——通過使用這種方式,可以讓項目設(shè)置多個活動Profile。
▲ Profile組及其成員的加載順序:
先加載Profile組對應(yīng)的資源(比如先加載prod)
然后按順序加載各組成員Profile對應(yīng)的資源(比如再加載banner、server)。
后加載的能覆蓋先加載的。
——Profile組 對應(yīng)的資源,總會被組成員對應(yīng)的資源所覆蓋。
【備注:】通過使用Profile組,可以設(shè)置多個活動profile,且它們的覆蓋順序是相當(dāng)穩(wěn)定的。
先加載組,然后再加載組里面的成員,后加載的會覆蓋前面的。
代碼演示:
需求:演示 profile 組 和 其成員的加載順序。
1、先在application.yml 中設(shè)置一個profile組,叫g(shù)p,
然后創(chuàng)建一個 profile 叫 application-gp.yml
【spring.profiles.active屬性用于切換活動profile,意味著最終最多時能有一個活動profile】
如圖:可以看出用 active ,表示切換到 gp 這個profile ,所以最先加載的就是這個 gp profile,
然后再加載 gp 這個組里面的成員,加載順序可以看成是按我們寫的順序從上往下,如圖中,先加載 dev 這個 profile ,然后再加載 test 這個 profile。
加載順序為:gp – dev – test
因為后加載的profile 會覆蓋 先加載的profile,所以最終執(zhí)行的 profile 就是 test 這個
訪問各個profile的方法,驗證加載順序
可以看出來:
1、啟動程序后,訪問的端口是8084,因為test這個profile配置文件的端口就是8084,說明test是最后加載的,覆蓋了前面的幾個profile。
2、然后訪問每個 profile 的控制器的方法,發(fā)現(xiàn) gp、dev、test 都能訪問成功,只有add這個profile訪問失敗,因為從上面的 application.yml 配置文件可以看出只配置了 gp、dev、test 這三個profile。而add這個沒有配置,肯定訪問失敗
3、可以看出無論是訪問 gp這個profile組,還是訪問 dev、test 這兩個活動profile,返回的結(jié)果都是 test 這個profile 的數(shù)據(jù)。說明因為配置了 gp、dev、test 這三個profile,所以表示gp、dev、test這三個控制器都生效,就是這三個開發(fā)環(huán)境都生效了。
但是因為test最后加載,把前面的gp和dev都覆蓋了,所以最終的開發(fā)環(huán)境就是以test這個profile為主。
★ 混合復(fù)合類型
混合復(fù)合類型,其實就是多個profile的覆蓋規(guī)則。
1. 若可從多個配置文件中加載List類型的屬性時,后加載的List集合總是完全替換之前加載List集合。
比如從第一個配置文件中加載的List集合包含2個元素,接著從第二個配置文件中加載的List集合包含1個元素,那么這個List集合屬性最終就只有一個元素。
2. 若可從多個配置文件中加載Map類型的屬性時,后加載的Map的key-value對將會添加到之前加載Map中。
比如先從第一個配置文件中加載的Map包含2個key-value對,接著從第二個配置文件中加載的Map集合包含1個key-value對、且該key-value與之前的兩個key-value對不沖突,那么這個Map屬性最終會包含3個key-value對。
【歸納】: List集合是完全覆蓋,Map集合則是元素添加。
代碼演示:
需求:演示 profile 里面的 list (覆蓋)和 Map (添加)
定義這個屬性處理類,作用是:拿對應(yīng)的yml配置文件中的值
這個是控制器中的方法,通過訪問,能更直觀的看到數(shù)據(jù)
測試結(jié)果: List集合是完全覆蓋,Map集合則是元素添加。
★ 根據(jù)環(huán)境自動更新Profile(多Profile的配置文件)
可使用三個減號(---)將一份.yml配置文件分割成邏輯上的多個片段(*.properties文件使用#---進(jìn)行分割),然
后可通過如下屬性指定各片段“條件性”生效:
▲ spring.config.activate.on-profile:
指定此行配置以下的配置僅當(dāng)指定Profile激活時才有效。該屬性值也支持使用取反運算符(!),比如“!dev”表示非dev Profile時有效。
▲ spring.config.activate.on-cloud-platform:指定此行配置以下的配置僅當(dāng)處于指定云平臺上時才有效。
如果使用此行配置,意味著該應(yīng)用可根據(jù)部署的云平臺自動切換它的配置片段(Profile)
【本質(zhì)】:就是將多個針對特定Profile的配置文件合并到一起。
代碼示例:
總結(jié)這個:根據(jù)環(huán)境自動更新Profile,就是上面我們創(chuàng)建很多yml配置文件,一個profile就創(chuàng)建一個yml配置文件,
如:application-dev.yml,application-gp.yml,application-test.yml,然后這三個活動profile需要在application.yml 里面進(jìn)行指定加載一個或者多個。
現(xiàn)在的需求:就是把a(bǔ)pplication-dev.yml,application-gp.yml,application-test.yml這三個profile的代碼直接全部都寫在application.yml 這個配置文件就行了,就不用創(chuàng)建那么多的application-xxxprofile.yml 的文件了。
三個配置文件的數(shù)據(jù),放在同一份yml中,需要用 — 這三個減號進(jìn)行分割,表示分成一個一個片段。
代碼:
把dev和test這兩個profile配置文件的代碼都添加到 application.yml這個配置文件里面,然后把原本各自的application-dev.yml,application-test.yml 里面的數(shù)據(jù)注釋掉
現(xiàn)在只指定了 dev ,所以也只有dev這個開發(fā)環(huán)境能生效。
訪問測試:
測試結(jié)果發(fā)現(xiàn)跟自己預(yù)料的不一樣。
如上面的圖可以看到指定的是 dev 開發(fā)環(huán)境,然后dev 這個片段在9-30行,test在31-52行,啟動項目后,發(fā)現(xiàn)第6行無論是指定dev還是test,最終加載的都是test這個開發(fā)環(huán)境,就像是test把dev覆蓋了一樣。
如圖:按理說啟動后端口應(yīng)該是dev的8083文章來源:http://www.zghlxwxcb.cn/news/detail-787408.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-787408.html
到了這里,關(guān)于22、springboot的Profile(通過yml配置文件配置 profile,快速切換項目的開發(fā)環(huán)境)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!