亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot屬性文件加載原理是什么

發布時間:2022-02-08 16:27:10 來源:億速云 閱讀:136 作者:iii 欄目:開發技術

本篇內容介紹了“SpringBoot屬性文件加載原理是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

    前言

    首先我們來看一個問題。就是我們在創建SpringBoot項目的時候會在對應的application.properties或者application.yml文件中添加對應的屬性信息,我們的問題是這些屬性文件是什么時候被加載的?如果要實現自定義的屬性文件怎么來實現呢?本文來給大家揭曉答案:

    SpringBoot屬性文件加載原理是什么

    1.找到入口

    結合我們前面介紹的SpringBoot中的監聽事件機制,我們首先看下SpringApplication.run()方法,在該方法中會針對SpringBoot項目啟動的不同的階段來發布對應的事件。

    SpringBoot屬性文件加載原理是什么

    處理屬性文件加載解析的監聽器是 ConfigFileApplicationListener ,這個監聽器監聽的事件有兩個。

    SpringBoot屬性文件加載原理是什么

    而我們進入SpringApplication.prepareEnvironment()方法中發布的事件其實就是ApplicationEnvironmentPreparedEvent事件。進入代碼查看。

    SpringBoot屬性文件加載原理是什么

    進行進入

    SpringBoot屬性文件加載原理是什么

    繼續進入會看到對應的發布事件:ApplicationEnvironmentPreparedEvent

    SpringBoot屬性文件加載原理是什么

    結合上篇文件的內容,我們知道在initialMulticaster中是有ConfigFileApplicationListener這個監聽器的。

    SpringBoot屬性文件加載原理是什么

    那么在此處觸發了配置環境的監聽器,后續的邏輯就應該進入對應的

    2.ConfigFileApplicationListener

    2.1 主要流程分析

    接下來我們看下ConfigFileApplicationListener中具體的如何來處理配置文件的加載解析的。

    SpringBoot屬性文件加載原理是什么

    根據邏輯我們直接進入onApplicationEnvironmentPreparedEvent()方法中。

    SpringBoot屬性文件加載原理是什么

    系統提供那4個不是重點,重點是 ConfigFileApplicationListener 中的這個方法處理.

    SpringBoot屬性文件加載原理是什么

    直接進入ConfigFileApplicationListener.postProcessEnvironment()方法。

    SpringBoot屬性文件加載原理是什么

    在進入addPropertySources()方法中會完成兩個核心操作,1。創建Loader對象,2。調用Loader對象的load方法,

    SpringBoot屬性文件加載原理是什么

    2.2 Loader構造器

    現在我們來看下在Loader構造器中執行了什么操作。

    SpringBoot屬性文件加載原理是什么

    通過源碼我們可以發現在其中獲取到了屬性文件的加載器、從spring.factories文件中獲取,對應的類型是 PropertySourceLoader類型。

    SpringBoot屬性文件加載原理是什么

    而且在loadFactories方法中會完成對象的實例化。

    SpringBoot屬性文件加載原理是什么

    到這Loader的構造方法執行完成了,然后來看下load()方法的執行。先把代碼貼上

    void load() {
    			FilteredPropertySource.apply(this.environment, DEFAULT_PROPERTIES, LOAD_FILTERED_PROPERTY,
    					(defaultProperties) -> {
    						// 創建默認的profile 鏈表
    						this.profiles = new LinkedList<>();
    						// 創建已經處理過的profile 類別
    						this.processedProfiles = new LinkedList<>();
    						// 默認設置為未激活
    						this.activatedProfiles = false;
    						// 創建loaded對象
    						this.loaded = new LinkedHashMap<>();
    						// 加載配置 profile 的信息,默認為 default
    						initializeProfiles();
    						// 遍歷 Profiles,并加載解析
    						while (!this.profiles.isEmpty()) {
    							// 從雙向鏈表中獲取一個profile對象
    							Profile profile = this.profiles.poll();
    							// 非默認的就加入,進去看源碼即可清楚
    							if (isDefaultProfile(profile)) {
    								addProfileToEnvironment(profile.getName());
    							}
    							load(profile, this::getPositiveProfileFilter,
    									addToLoaded(MutablePropertySources::addLast, false));
    							this.processedProfiles.add(profile);
    						}
    						// 解析 profile
    						load(null, this::getNegativeProfileFilter, addToLoaded(MutablePropertySources::addFirst, true));
    						// 加載默認的屬性文件 application.properties
    						addLoadedPropertySources();
    						applyActiveProfiles(defaultProperties);
    					});
    		}

    然后我們進入具體的apply()方法中來查看。

    SpringBoot屬性文件加載原理是什么

    中間的代碼都有注釋,主要是處理profile的內容。

    SpringBoot屬性文件加載原理是什么

    首先是getSearchLocations()方法,在該方法中會查詢默認的會存放對應的配置文件的位置,如果沒有自定義的話,路徑就是 file:./config/ file:./ classpath:/config/ classpath:/ 這4個

    SpringBoot屬性文件加載原理是什么

    SpringBoot屬性文件加載原理是什么

    然后回到load方法中,遍歷4個路徑,然后加載對應的屬性文件。

    SpringBoot屬性文件加載原理是什么

    getSearchNames()獲取的是屬性文件的名稱。如果自定義了就加載自定義的

    SpringBoot屬性文件加載原理是什么

    否則加載默認的application文件。

    SpringBoot屬性文件加載原理是什么

    再回到前面的方法

    SpringBoot屬性文件加載原理是什么

    進入load方法,會通過前面的兩個加載器來分別加載application.properties和application.yml的文件。

    SpringBoot屬性文件加載原理是什么

    loader.getFileExtensions()獲取對應的加載的文件的后綴。

    SpringBoot屬性文件加載原理是什么

    SpringBoot屬性文件加載原理是什么

    SpringBoot屬性文件加載原理是什么

    進入loadForFileExtension()方法,對profile和普通配置分別加載

    SpringBoot屬性文件加載原理是什么

    繼續進入load方法

    SpringBoot屬性文件加載原理是什么

    SpringBoot屬性文件加載原理是什么

    SpringBoot屬性文件加載原理是什么

    SpringBoot屬性文件加載原理是什么

    SpringBoot屬性文件加載原理是什么

    開始加載我們存在的application.properties文件。

    2.3 properties加載

    在找到了要加載的文件的名稱和路徑后,我們來看下資源加載器是如何來加載具體的文件信息的。

    SpringBoot屬性文件加載原理是什么

    進入loadDocuments方法中,我們會發現會先從緩存中查找,如果緩存中沒有則會通過對應的資源加載器來加載了。

    SpringBoot屬性文件加載原理是什么

    此處是PropertiesPropertySourceLoader來加載的。

    SpringBoot屬性文件加載原理是什么

    SpringBoot屬性文件加載原理是什么

    進入loadProperties方法

    SpringBoot屬性文件加載原理是什么

    之后進入load()方法看到的就是具體的加載解析properties文件中的內容了。感興趣的可以看下具體的邏輯,本文就給大家介紹到這里了。

    SpringBoot屬性文件加載原理是什么

    “SpringBoot屬性文件加載原理是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    息烽县| 来安县| 郸城县| 梁河县| 乌兰察布市| 安阳市| 卢湾区| 买车| 延津县| 朝阳区| 会理县| 永清县| 九龙县| 介休市| 天峨县| 原阳县| 上林县| 富民县| 汾阳市| 漳州市| 贵州省| 合阳县| 福贡县| 嵩明县| 广州市| 罗江县| 广水市| 万宁市| 延津县| 扎兰屯市| 凉山| 思茅市| 惠州市| 海门市| 五家渠市| 新和县| 浦北县| 韩城市| 乌拉特后旗| 固安县| 定安县|