精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

你絕對不知道的 SpringBoot 的外部化配置特性!

開發 前端
今天了不起帶大家研究了一個 SpringBoot? 的外部化配置,并且通過實際的一個 case 跟蹤代碼的調用鏈來給大家測試了一下,雖然說這個知識點我們經常都在使用,但是沒看到底層源碼的時候我們并不知道這樣的一個功能底層是怎樣的復雜的。

作為 Java? 程序員,相信大家都知道,我們日常的 SpringBoot? 項目會有一個配置文件 application.properties 文件。

里面會配置很多參數,例如服務的端口等,這些都只是默認值,在不改變配置文件里面內容的情況下,我們可以通過在部署的時候,傳遞一個相應的參數來替換默認的參數。

那么問題來了,你有想過為什么可以這樣嗎?為什么 SpringBoot 部署時傳遞的啟動配置會生效,而配置文件中的配置就不生效了呢?或者說這兩者的優先級是什么樣子的呢?

外部化配置

要解釋上面的問題,我們就需要知道 SpringBoot 到底支持哪些配置形式,以及這些配置方式的優先級是什么樣子的,只有搞清楚了這個,才能真正的解決配置的優先級問題。

在 SpringBoot 的官方文檔中我們可以看到這么一段描述

圖片

用了不起我拙劣的英語翻譯一下,大概的意思就是:Spring Boot? 提供了將配置文件外部化的功能,這樣您就可以在不同環境下使用相同的應用程序代碼。您可以使用 properties? 文件、YAML 文件、環境變量以及命令行參數來外部化配置文件。

通過 @Value? 注解,屬性值可以直接注入到 beans? 中,通過 Environment abstraction?(環境映射)可以訪問其他位置,或者使用 @ConfigurationProperties 綁定結構化對象。

有哪些外部配置

既然上面提到了 SpringBoot? 提供了外部化配置,那么 SpringBoot 提供了哪些配置呢?依然是通過官方文檔,我們可以看到有如下配置列表

圖片

從上圖可以看到 SpringBoot 總共內置了 17 種外部化配置方法,而且這 17 種的優先級是從上到下依次優先的。這些方式中我們常用的有 4 命令行方法,9 Java 系統環境變量,10 操作系統環境變量,以及 12 到 15 到配置文件的形式。

通過上面的順序我們就可以解釋為什么我們通過命令行配置的參數會生效,而配置文件中的默認值就會忽略了,從而達到了覆蓋配置的目的。

PropertySource

上面的文檔中也提到了,SpringBoot? 主要是通過 PropertySource? 機制來實現多樣屬性源的,SpringBoot? 的 PropertySource? 是一種機制,用于加載和解析配置屬性,可以從多種來源獲取這些屬性,例如文件、系統環境變量、JVM? 系統屬性和命令行參數等。PropertySource? 是 Spring 框架中的一個抽象接口,它定義了如何讀取屬性源的方法。

圖片

通過 SpringBoot? 的代碼,我們可以看到,org.springframework.core.env.PropertySource? 是一個抽象類,實現在子類有很多,我們上面提到的命令行 PropertySource? 是 org.springframework.core.env.CommandLinePropertySource。整體的類圖如下,涵蓋的內容還是很多的,感興趣的小伙伴可以好好研究一番。

圖片

另外在 SpringBoot? 中,我們還可以使用 @PropertySource 注解來自定義指定要加載的屬性文件。例如,可以在應用程序的主類上添加以下注解:

@SpringBootApplication
@PropertySource("classpath:customer.properties")
public class CustomerProperties {
// ...
}

這將告訴 SpringBoot? 在 classpath? 下查找名為 customer.properties? 的文件,并將其加載為屬性源。然后,可以使用 @Value?注解將屬性值注入到 bean 中,如下所示:

@Service
public class MyService {
@Value("${my.property}")
private String myProperty;
// ...
}

這里的 ${my.property}? 是從 customer.properties? 文件中獲取的屬性值。如果找不到該屬性,那么 SpringBoot 將使用默認值,這里因為是自定義的屬性,是沒有默認值的,就會報錯,項目無法啟動。

具體實現是,SpringBoot? 在啟動時會自動加載和解析所有的 PropertySource?,包括默認的 PropertySource? 和自定義的PropertySource?。這些屬性值被存儲在 Spring? 環境中,可以通過 Spring? 的 Environment? 對象訪問。當屬性被注入到 bean? 中時, Spring? 會查找 Environment 對象并嘗試解析屬性的值。

總之,SpringBoot? 的 PropertySource? 提供了一種簡單的方法來加載和解析應用程序的配置屬性,這些屬性可以從多個來源獲取。它通過將屬性值存儲在 Spring 環境中,使其易于在應用程序的不同部分中使用。

調試

為了驗證上面說的命令行的參數配置要優先于配置文件,我們創建一個 SpringBoot 項目,并且在 application.properties? 文件中配置一個參數 name=JavaGeekTech?,而在 IDEA 啟動窗口中配置 name=JAVA_JIKEJUSHU,分別如下所示

圖片

圖片

在寫一個簡單的 HelloController? 類,并且通過 @Value? 注解注入 name? 屬性,接下來我們就需要調試看下,SpringBoot?是如何將 name? 屬性賦值的。通過驗證 name? 會被賦值成 JAVA_JIKEJISHU? 而不是 JavaGeekTech。

package com.example.demo.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

@Value("${name}")
private String name;

@GetMapping(value = "/hello")
public String hello() {
return helloService.sayHello(name);
}

}

接著我們啟動 debug?,因為我們是基于 SpringBoot? 的,屬性的賦值是在創建 bean? 的時候,從 createBean?,到 doCreateBean?,再到 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean?,因為每個 bean? 都會經過很多 PostProcessor? 的處理,屬性賦值的 PostProcessor? 是 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor#postProcessProperties

圖片

里面的 metadata.inject? 會調用到 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.AutowiredFieldElement#inject?,再到 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.AutowiredFieldElement#resolveFieldValue,

org.springframework.beans.factory.support.DefaultListableBeanFactory#resolveDependency,

org.springframework.beans.factory.support.DefaultListableBeanFactory#doResolveDependency,

org.springframework.beans.factory.support.AbstractBeanFactory#resolveEmbeddedValue,

org.springframework.core.env.AbstractPropertyResolver#resolveRequiredPlaceholders,

org.springframework.core.env.PropertySourcesPropertyResolver#getPropertyAsRawString,

org.springframework.core.env.PropertySourcesPropertyResolver#getProperty(java.lang.String, java.lang.Class<T>, boolean)

整體調用鏈還是挺長的,不過只要跟著思路,在配合斷點,還是可以看看看出來的。

圖片

在 getProperty? 方法中,我們可以看到如下的邏輯,根據 key? 獲取到的 value? 值為JAVA_JIKEJISHU。

圖片

繼續跟蹤 getProperty? 方法,我們可以看到這個方法 org.springframework.boot.context.properties.source.ConfigurationPropertySourcesPropertySource#findConfigurationProperty(org.springframework.boot.context.properties.source.ConfigurationPropertyName),

圖片

其中的 getSource() 中就有我們配置的兩個屬性源的數據,如下所示

圖片

根據代碼邏輯,我們也可以看到,在迭代的時候,如果找到了一個就直接返回了,所以得到的結果是JAVA_JIKEJISHU。

總結

今天了不起帶大家研究了一個 SpringBoot? 的外部化配置,并且通過實際的一個 case 跟蹤代碼的調用鏈來給大家測試了一下,雖然說這個知識點我們經常都在使用,但是沒看到底層源碼的時候我們并不知道這樣的一個功能底層是怎樣的復雜的。

這里還是要敬佩一下 SpringBoot 的開發者,同時也建議大家,在日常的開發中我們需要多看看底層的源碼,通過不斷的看源碼,我們能更好的理解特性的實現原理,從而加強我們自身的能力。


責任編輯:武曉燕 來源: Java極客技術
相關推薦

2023-03-26 08:15:04

代碼配置Spring

2023-02-27 09:20:24

絕對定位CSS

2020-06-12 09:20:33

前端Blob字符串

2020-07-28 08:26:34

WebSocket瀏覽器

2011-08-12 09:27:33

移動設備虛擬化虛擬化

2024-01-09 07:39:20

maven特性版本

2009-12-10 09:37:43

2022-10-13 11:48:37

Web共享機制操作系統

2021-02-01 23:23:39

FiddlerCharlesWeb

2011-09-15 17:10:41

2010-08-23 09:56:09

Java性能監控

2022-11-04 08:19:18

gRPC框架項目

2020-09-15 08:35:57

TypeScript JavaScript類型

2013-09-09 09:59:39

虛擬化云計算

2021-10-17 13:10:56

函數TypeScript泛型

2012-11-23 10:57:44

Shell

2021-12-29 11:38:59

JS前端沙箱

2021-12-22 09:08:39

JSON.stringJavaScript字符串

2015-06-19 13:54:49

2020-08-11 11:20:49

Linux命令使用技巧
點贊
收藏

51CTO技術棧公眾號

日韩污视频在线观看| 国产精彩免费视频| 国产极品久久久| 最新亚洲视频| 亚洲午夜久久久影院| 超碰在线97免费| 国产成人无吗| 成人高清视频在线观看| 青青久久av北条麻妃黑人| 卡一卡二卡三在线观看| 视频精品一区| 91成人免费在线视频| 美女黄色片网站| 天天影院图片亚洲| 麻豆91精品视频| 97视频在线观看成人| 日本一卡二卡在线播放| 人妻少妇一区二区| 91超碰在线播放| 国产精品视频一区二区三区不卡| 成人自拍爱视频| 神马久久久久久久| 亚洲性人人天天夜夜摸| 一区二区三区国产在线观看| 丰满熟女人妻一区二区三区| 狠狠久久伊人中文字幕| 天天av天天翘天天综合网| 亚洲电影网站| 青青草视频在线观看| 国产成人日日夜夜| 国产精品久久久久91| 日韩大片免费在线观看| 66视频精品| 伊人一区二区三区久久精品| 无码人妻精品一区二区三区温州| 国产在线视频二区| www.丝袜精品| 欧美一区二区视频在线观看2020| 亚洲男人天堂色| 免费看男女www网站入口在线| 亚洲蜜臀av乱码久久精品蜜桃| 日韩欧美亚洲在线| 欧美色18zzzzxxxxx| 粉嫩一区二区三区性色av| 成人激情免费在线| 羞羞色院91蜜桃| 国产精品日本| 97超级碰碰人国产在线观看| 国产一级片免费| 91成人影院| 久久精彩免费视频| 亚洲精品国产精品乱码在线观看| 国产一区二区三区站长工具| 亚洲美女av网站| 韩国无码一区二区三区精品| 哺乳一区二区三区中文视频 | 国产精品suv一区二区69| 911精品美国片911久久久| 精品国产一区二区三区在线观看| www成人啪啪18软件| 俺要去色综合狠狠| 少妇高潮久久77777| 国产视频123区| 99精品小视频| 欧美xxxx做受欧美| 好吊色视频在线观看| 欧美freesex交免费视频| 欧美成人网在线| 免费一级片视频| 在线播放一区| 欧美孕妇性xx| 日本成人一级片| 国产乱色精品成人免费视频 | 伊人久久大香线蕉av一区| av大片在线看| 国产精品久久久久影院老司| 自拍偷拍视频在线| 中文字幕中文字幕在线十八区| 一区二区三区美女视频| 国产玉足脚交久久欧美| 一区二区电影免费观看| 欧美亚洲综合另类| 女王人厕视频2ⅴk| 加勒比久久高清| 亚洲午夜精品久久久久久性色| 国产黄a三级三级| 国产精品国码视频| 4k岛国日韩精品**专区| 亚洲无码精品在线观看| 国产**成人网毛片九色| 欧美高清一区二区| 免费av在线网址| 五月天视频一区| 久久久久国产一区| 秋霞午夜一区二区三区视频| 日韩av在线资源| 人妻av无码一区二区三区| 国产精品传媒精东影业在线| 久久久久久有精品国产| 亚洲 国产 日韩 欧美| 国产精品1区2区3区在线观看| 精品一区在线播放| 老司机精品视频在线观看6| 亚洲国产wwwccc36天堂| 久久久精品麻豆| jizz性欧美23| 丝袜亚洲另类欧美重口| 日本特黄一级片| 久久精品国产99国产精品| 国产一区二区久久久| 日韩伦理在线电影| 岛国av在线不卡| 久久精品一二三四| 深爱激情久久| 久久久这里只有精品视频| 亚洲无码精品在线观看| 久久综合九色综合久久久精品综合| 正在播放亚洲| 自拍偷自拍亚洲精品被多人伦好爽| 欧美一级精品在线| 变态另类ts人妖一区二区| 在线观看不卡| 999视频在线观看| sese一区| 一道本成人在线| 国产女人18毛片水真多18| 91精品啪在线观看国产18| 国产成人一区二| 手机看片1024国产| 亚洲乱码国产乱码精品精的特点| 乌克兰美女av| 九九免费精品视频在线观看| 性金发美女69hd大尺寸| www.97av| 亚洲精品欧美专区| 亚洲黄色av片| 色欧美自拍视频| 国产精品日日摸夜夜添夜夜av| 青青草在线免费视频| 午夜精品福利视频网站| 国产麻豆剧传媒精品国产av| 欧美伊人久久| 亚洲a在线播放| 黄视频在线观看网站| 欧美日韩第一区日日骚| 纪美影视在线观看电视版使用方法| 久久国产毛片| 青青草成人激情在线| 深夜av在线| 精品五月天久久| 久久99精品波多结衣一区| 成人国产精品免费观看视频| 国产高清www| 国产精品调教| 97在线视频一区| 亚洲色图 校园春色| 亚洲综合区在线| wwwxx日本| 亚洲国产三级| 久久亚洲综合网| 香蕉视频亚洲一级| 一区二区三区视频在线| 中文字幕人妻精品一区| 国产精品福利在线播放| 色18美女社区| 午夜日韩电影| 国产日韩三区| 色豆豆成人网| www.久久久久| 韩国中文字幕hd久久精品| 性欧美大战久久久久久久久| 久久亚洲AV成人无码国产野外 | 欧美特黄一级视频| 午夜精品成人在线视频| xxxx日本黄色| 国产一二三精品| 欧美一级欧美一级| 伊人精品一区| 国产在线高清精品| 手机在线免费av| 精品亚洲va在线va天堂资源站| 国产主播第一页| 中文字幕一区日韩精品欧美| www.欧美com| 亚洲在线网站| 在线视频不卡一区二区三区| 91精品短视频| 国产精品444| av免费在线免费观看| 日韩av在线免费观看| www.久久网| 亚洲国产视频一区| 精品人妻一区二区三区蜜桃视频| 激情都市一区二区| 波多野结衣家庭教师在线| 成人情趣视频网站| 国产精品免费一区二区| 欧美精选视频一区二区| 欧美精品制服第一页| 日夜干在线视频| 欧美一级日韩免费不卡| 色屁屁影院www国产高清麻豆| 一区在线观看免费| 超碰97在线资源站| 韩国毛片一区二区三区| 50路60路老熟妇啪啪| 欧美三级在线| 亚洲女人毛片| 亚洲大片精品免费| 成人久久18免费网站漫画| 亚洲成人av观看| 欧美夫妻性生活xx| 日韩伦理在线观看| 亚洲另类xxxx| 黄色小视频免费观看| 91精品午夜视频| 精品人妻无码一区二区性色 | 日本视频在线观看免费| 洋洋av久久久久久久一区| 精品亚洲aⅴ无码一区二区三区| 成人动漫中文字幕| 日本一二三四区视频| 日韩福利视频导航| 日本三级免费观看| 亚洲激情自拍| 欧美性猛交内射兽交老熟妇| 久久激情电影| 日韩电影天堂视频一区二区| 欧美一区 二区| 福利视频一区二区三区| 91麻豆精品一二三区在线| 国产美女久久精品香蕉69| 成人开心激情| 日韩av免费看网站| 国产在线观看www| 欧美激情精品久久久久久蜜臀 | 久久久久国产一区二区三区| 老司机精品影院| 色阁综合伊人av| av在线播放av| 色偷偷888欧美精品久久久| 国产小视频在线播放| 日韩精品在线电影| 亚洲日本国产精品| 日韩精品亚洲元码| 日韩欧美在线观看一区二区| 日韩精品视频在线观看免费| 无套内谢的新婚少妇国语播放| 亚洲国产精品va| 污视频在线免费| 日韩av有码在线| 四虎精品在线| 亚洲欧美日韩成人| 黄色片在线免费观看| 中日韩美女免费视频网址在线观看 | а√天堂中文资源在线bt| 欧美黑人国产人伦爽爽爽| 欧美草逼视频| 国产69久久精品成人| 成人欧美大片| 国产精品一区二区三区成人| 24小时成人在线视频| 91超碰在线免费观看| 日韩精品一区二区三区中文在线 | 欧美黄色网视频| 久久偷看各类wc女厕嘘嘘偷窃| 亚洲成a人片77777在线播放| 日本一区二区在线| 日韩国产欧美| 2021狠狠干| 一区二区三区国产在线| 国产成人亚洲精品无码h在线| 天堂影院一区二区| www.日本xxxx| 国产伦精品一区二区三区视频青涩 | 精品无码人妻一区二区三区| 香蕉成人伊视频在线观看| 国产免费av一区| 欧美日韩在线播放三区| 精品人妻一区二区三区浪潮在线| 日韩av在线免费播放| 幼a在线观看| 欧美国产在线电影| 精品91久久| 91久久精品美女| 免费看久久久| 一区高清视频| 日韩午夜av在线| 日韩一区二区三区久久| 国产91丝袜在线18| 精品人妻无码一区二区三区换脸| 成人免费一区二区三区视频| 日干夜干天天干| 欧美天堂亚洲电影院在线播放| www.久久成人| 国产亚洲人成网站在线观看| 超碰caoporn久久| 欧美最顶级的aⅴ艳星| 精品视频91| 天堂精品一区二区三区| 亚洲激情亚洲| 999热精品视频| 国产午夜精品福利| 久久婷婷综合国产| 欧美伊人精品成人久久综合97| 亚洲AV无码精品色毛片浪潮| 中文字幕久精品免费视频| а√在线天堂官网| 成人午夜在线观看| 综合色就爱涩涩涩综合婷婷| 青青草原国产免费| 久久不射2019中文字幕| 性一交一黄一片| 欧美韩国日本综合| 日本三级小视频| 日韩欧美专区在线| 337p日本欧洲亚洲大胆鲁鲁| 97av视频在线| 9l视频自拍九色9l视频成人| 国产精品jizz在线观看老狼| 久久婷婷激情| 久久久老熟女一区二区三区91| 亚洲欧洲综合另类在线| 欧美日韩 一区二区三区| 亚洲精品在线不卡| heyzo一区| 99超碰麻豆| 91精品国产91久久久久久黑人| 激情五月亚洲色图| 久久综合丝袜日本网| 国产福利拍拍拍| 欧美成人精品1314www| av网站大全在线| 91免费国产视频| 欧美激情偷拍自拍| 中文字幕国产传媒| 中文字幕av在线一区二区三区| 久久久久99精品成人片三人毛片| 亚洲第一区中文99精品| 蜜桃成人365av| 国产精华一区二区三区| 国产一区观看| www.四虎精品| 一区二区在线免费观看| 精品人妻av一区二区三区| 久久这里有精品| 国产精品美女久久久久人| 丰满女人性猛交| 国产一区999| 精品少妇久久久| 亚洲大胆美女视频| 国产99在线观看| 精品国产福利| 亚洲永久字幕| 国产jk精品白丝av在线观看| 欧美系列一区二区| 成全电影播放在线观看国语| 国产精品久久久久影院日本 | 国产毛片久久久久久国产毛片| 国产呦萝稀缺另类资源| 美女的奶胸大爽爽大片| 精品久久久久久久久久久久包黑料| caoporn-草棚在线视频最| 精品一区二区三区日本| 久久美女性网| 国产传媒视频在线| 欧美一区二区在线视频| 青春草在线视频| 久久精品国产一区二区三区不卡| 中文在线一区| 亚洲理论片在线观看| 欧美日韩aaaaaa| 好久没做在线观看| 久久精品第九区免费观看| 免费在线观看成人| 欧美黑人性猛交xxx| 亚洲国产一区二区三区四区| 在线观看精品| 蜜臀av.com| 99re66热这里只有精品3直播| 亚洲国产无线乱码在线观看| 久久99精品久久久久久青青91| 四虎5151久久欧美毛片| 欧美日韩在线观看不卡| 亚洲精品你懂的| 欧美特黄一级视频| 国产精品久久久久国产a级| 综合久久婷婷| 新91视频在线观看| 91精品国产全国免费观看| 正在播放日韩精品| 在线观看成人av| 成人免费视频app| 中文字幕欧美人妻精品| 欧美日韩aaaa| 成人高清电影网站| 久久久久亚洲AV成人网人人小说| 在线看国产一区二区| 日皮视频在线观看| 日韩精品国内|