精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

青娱乐国产91| 国产一区二区三区在线视频| 欧美一级视频在线播放| 色资源在线观看| 日韩成人午夜精品| 九九精品在线视频| 蜜桃av免费看| 亚洲一区二区三区中文字幕在线观看 | 欧美熟乱15p| 日韩欧美亚洲国产另类| 成年人免费大片| 牛牛电影国产一区二区| 国产偷国产偷亚洲高清人白洁| 91美女片黄在线观| 中文字幕在线播| 国模 一区 二区 三区| 亚洲最新av在线| 亚洲成年人av| 亚洲国产综合在线观看| 色美美综合视频| 国产不卡一区二区视频| 黄色网在线免费观看| 国产午夜精品一区二区三区四区| av一区二区在线看| 亚洲一线在线观看| 日韩高清不卡在线| 57pao精品| 欧美视频观看一区| 国产美女三级视频| 超碰公开在线| 国产精品剧情在线亚洲| 欧美午夜视频在线| 香蕉视频网站在线| 成人激情动漫在线观看| 亚洲www在线观看| 亚洲无码久久久久久久| 日本成人中文字幕在线视频| 91精品成人久久| 久久精品无码人妻| 欧美日韩蜜桃| 大量国产精品视频| 日本在线一级片| 91综合在线| 日韩有码在线观看| 精品在线观看一区| 日韩欧美网址| 中文字幕v亚洲ⅴv天堂| 91激情视频在线观看| 亚洲专区视频| 亚洲精品天天看| 三级网站在线免费观看| 亚洲制服欧美另类| 亚洲色图第一页| 久久视频精品在线观看| 欧美日韩亚洲在线观看| 中文字幕在线观看亚洲| 91麻豆精品久久毛片一级| 欧美顶级大胆免费视频| 久久九九免费视频| 性色av无码久久一区二区三区| 综合视频在线| 久久人人看视频| 免费毛片一区二区三区| 校园春色综合网| 国产精品久久久久影院日本| 亚洲视频一区在线播放| 国内精品在线播放| 国产成人女人毛片视频在线| 五月婷婷在线观看视频| 国产午夜精品美女毛片视频| 少妇特黄a一区二区三区| 欧美性猛交xxx乱大交3蜜桃| 玉足女爽爽91| 日韩人妻精品无码一区二区三区| 久久毛片亚洲| 91精品国产高清一区二区三区| 九色91porny| 午夜精品影视国产一区在线麻豆| 国产一区二区三区18| 波多野结衣在线网址| 国产一区日韩欧美| 日韩av电影手机在线| 一级成人免费视频| gogogo免费视频观看亚洲一| 欧美系列一区| 青春草在线免费视频| 欧美三级xxx| 91亚洲免费视频| 精品国产导航| 色综合伊人色综合网| 美女视频黄免费| 狂野欧美一区| 91免费观看| 国产福利在线看| 亚洲精品美腿丝袜| 无码少妇一区二区三区芒果| 精品精品视频| 日韩精品中文在线观看| 四虎影院中文字幕| 国产女优一区| 亚洲一区二区免费| 人人九九精品| 亚洲图片一区二区| 中文字幕永久有效| 九一国产精品| 欧美激情网友自拍| 中文字幕在线网站| 91免费国产在线| 成人在线免费观看网址| 日日av拍夜夜添久久免费| 日韩欧美一区中文| 欧美巨胸大乳hitomi| av不卡免费看| 国产精品xxxx| 成人毛片av在线| 欧美丝袜丝交足nylons图片| 一本色道综合久久欧美日韩精品 | 国产成人av电影在线| 亚洲欧美精品| 少妇一区视频| 亚洲精品一区二区在线| 久久综合色综合| 国产精品伊人色| 天天综合色天天综合色hd| 女厕盗摄一区二区三区| 精品国产伦一区二区三区观看体验| 中文字幕在线观看二区| 日韩精品亚洲专区| 久久精品第九区免费观看| 精精国产xxxx视频在线中文版| 欧美日韩国产a| 日本一道本视频| 日韩专区一卡二卡| 日本成人黄色免费看| 涩涩网在线视频| 亚洲国产成人精品一区二区 | 欧美亚日韩国产aⅴ精品中极品| 久久人妻少妇嫩草av无码专区| 欧美片第1页综合| 国产精品丝袜视频| 国产精品影院在线| 欧美综合一区二区| 黄色片网站免费| 秋霞午夜av一区二区三区| 欧美日韩亚洲免费| 欧美大片免费| 一区二区三区黄色| 糖心vlog精品一区二区| 国产精品视频线看| 91亚洲精品久久久蜜桃借种| 欧美丰满老妇| 成人欧美视频在线| bl视频在线免费观看| 亚洲精品国产精品国自产在线 | 日韩电影中文字幕一区| 圆产精品久久久久久久久久久| 成人97人人超碰人人99| 黄色www网站| 一区二区三区韩国免费中文网站| 日本精品在线视频| 爱久久·www| 欧美一区二视频| 日韩av电影网址| 久久亚洲影视婷婷| 免费看涩涩视频| 一区二区在线影院| 国内精品二区| 日韩视频网站在线观看| 久久精品亚洲热| 好男人在线视频www| 欧美午夜精品在线| 国产麻豆a毛片| 懂色av噜噜一区二区三区av| 浮妇高潮喷白浆视频| 欧美三级美国一级| 亚洲va久久久噜噜噜| 98色花堂精品视频在线观看| 亚洲人午夜精品| 亚洲一级黄色大片| 亚洲一区二区av电影| 魔女鞋交玉足榨精调教| 老汉av免费一区二区三区 | 特级毛片在线| 亚洲色图25p| 国产高清视频免费| 欧美天天综合色影久久精品| 男人av资源站| 91小视频在线观看| 在线观看免费不卡av| 在线国产精品一区| 一区二区三区四区欧美| 国产一区丝袜| 成人乱人伦精品视频在线观看| 欧美一卡二卡| 色偷偷av一区二区三区乱| 天天干,夜夜操| 欧美喷潮久久久xxxxx| 国产精品suv一区二区69| 国产校园另类小说区| 亚洲av无码久久精品色欲| 日精品一区二区| 久久av综合网| 91精品婷婷色在线观看| 蜜桃传媒视频麻豆第一区免费观看| 婷婷激情成人| 国产精品jizz在线观看麻豆| 后进极品白嫩翘臀在线播放| 中文字幕久久亚洲| 亚洲欧洲国产综合| 精品久久久久一区| 国产一区二区在线播放视频| 一本大道av伊人久久综合| 免费一级片在线观看| 国产精品福利电影一区二区三区四区| 黄色av网址在线观看| 国产麻豆成人精品| 日韩成人精品视频在线观看| 久久免费黄色| 亚洲国产精品久久久久婷蜜芽 | 女人另类性混交zo| 亚洲激情黄色| 91免费视频网| 欧美精品色婷婷五月综合| 欧美激情1区2区3区| 亚洲人体一区| 日本精品三区| 欧美在线播放一区二区| 欧美sss在线视频| 丁香婷婷久久久综合精品国产| 亚洲成人人体| 久久久人成影片一区二区三区观看| 麻豆视频网站在线观看| 夜夜躁日日躁狠狠久久88av| 精品无吗乱吗av国产爱色| 精品一区二区电影| 无码精品人妻一区二区三区影院 | 国产精品999| 自拍在线观看| 欧美做爰性生交视频| 欧美sm一区| 51午夜精品视频| 免费h在线看| 欧美一级大片在线观看| 在线天堂新版最新版在线8| 欧美中文字幕第一页| 草草在线视频| 国产69久久精品成人看| 天堂av在线网| 日韩免费黄色av| 精品视频在线一区二区在线| 国产精品久久中文| 国产精品久久久久77777丨| 国产精品亚发布| 91精品国产一区二区在线观看 | 精品国产aⅴ一区二区三区东京热| 国产精品一区在线观看你懂的| 中文字幕一区二区三区四| 国产美女av一区二区三区| 久久发布国产伦子伦精品| 豆国产96在线|亚洲| 亚洲一区二区在线免费| 福利一区二区在线| 最近日本中文字幕| 久久久精品免费观看| 影音先锋男人看片资源| 自拍偷拍亚洲欧美日韩| 久久精品免费av| 欧美日韩激情视频8区| 懂色av中文字幕| 欧美精品久久久久久久多人混战 | 精品久久久久久久无码| 日本不卡一二三区黄网| 日韩欧美理论片| 高清国产一区二区| 3d动漫精品啪啪一区二区下载| 天天射综合网视频| 在线播放欧美女士性生活| 日韩污视频在线观看| 在线免费av一区| 国产成人精品一区二三区四区五区 | 欧美大片网址| 亚洲一区高清| 亚洲视屏一区| 亚洲天堂网一区| 成人精品国产一区二区4080| 女人又爽又黄免费女仆| 亚洲美女视频一区| 成人在线免费看视频| 欧美精品久久天天躁| 日韩资源在线| 久久亚洲精品成人| 成人av免费电影网站| 91久久久在线| 国产videos久久| 91免费版看片| 美国av一区二区| 国产一级二级在线观看| ...xxx性欧美| caoporn国产| 亚洲第一精品自拍| 免费在线看黄| 日本最新高清不卡中文字幕| 日本一区二区乱| 午夜精品一区二区在线观看的| 在线日本成人| www.五月天色| 国产精品污网站| 久久不卡免费视频| 日韩一区二区电影| 在线观看麻豆蜜桃| 日本精品久久中文字幕佐佐木| 欧洲精品99毛片免费高清观看| 视频一区视频二区视频三区高| 一区在线免费| 国产高清999| 中文字幕精品一区| 国产成人精品一区二三区| 日韩欧美在线观看一区二区三区| 3p视频在线观看| 国产福利精品视频| 任你弄精品视频免费观看| 中国丰满熟妇xxxx性| 国产尤物一区二区在线| 丁香六月激情综合| 91福利在线免费观看| 欧美69xxxxx| 2019中文字幕全在线观看| 牛牛影视久久网| a级免费在线观看| 丰满大乳少妇在线观看网站 | 自拍偷拍一区二区三区四区 | 成人免费视频国产免费观看| 欧美色图天堂网| 北条麻妃在线| 国产精品视频成人| 日韩av免费大片| 九九热99视频| 国产精品福利一区| 91麻豆视频在线观看| 精品国产美女在线| 亚洲黑人在线| 大地资源网在线观看免费官网| 国产一区二区三区四区五区入口| 亚洲不卡在线播放| 91精品国产乱| 黄页在线观看免费| 国产精品美女久久久久av福利| 亚洲先锋成人| 呦呦视频在线观看| 一本高清dvd不卡在线观看| 日本电影一区二区在线观看| 欧美主播福利视频| 色综合中文网| 亚洲欧洲日本精品| 亚洲少妇30p| 人妻丰满熟妇av无码区hd| 亚州成人av在线| 亚洲视频分类| 超碰在线播放91| 中文字幕日本乱码精品影院| 国产日韩一级片| 国a精品视频大全| 亚洲第一二三区| 中文字幕欧美人妻精品一区| 国产精品久线观看视频| 亚洲h视频在线观看| 98视频在线噜噜噜国产| gogogo高清在线观看一区二区| 久久精品国产露脸对白| 亚洲电影中文字幕在线观看| 欧美香蕉爽爽人人爽| 国产日产欧美精品| 极品av少妇一区二区| 精品无人区无码乱码毛片国产 | 68国产成人综合久久精品| 亚洲一二三区精品| 黄色在线免费看| 国产精品精品视频| 亚洲影视一区| 韩国无码一区二区三区精品| 欧美视频一区二区三区在线观看| 91精品久久久| 久久久婷婷一区二区三区不卡| 免费观看日韩av| 国产一级做a爰片在线看免费| 亚洲欧美国产高清va在线播| **精品中文字幕一区二区三区| 久久国产精品视频在线观看| 国产精品欧美一级免费| 黄色一级a毛片| 国产精品视频内| 亚洲国产片色| 91动漫免费网站| 日韩精品黄色网| 韩国三级成人在线| 男人亚洲天堂网| 亚洲乱码国产乱码精品精可以看 | 一区二区三区免费观看视频| 久久人人97超碰精品888| 国产精品伦理久久久久久|