SpringBoot之靜態資源配置原理

在實際工作中SpringBoot專案應用,有些專案沒有前後端分離,靜態資源也放在應用中,會碰到如下圖的靜態資源配置。有些夥伴會跟我有同樣疑問靜態資源這樣放是什麼原因?最近剛好有時間,帶著多年的疑問去研究,在翻看了原始碼後,終於解開了多年的疑惑。因此寫了此文與夥伴分享,讓大夥少走彎路!

SpringBoot之靜態資源配置原理

一 靜態資源配置原始碼分析

1 當例項化resourceHandlerMapping時,呼叫addResourceHandlers函式,向ResourceHandlerRegistry例項屬性locationValues賦值(為靜態資源的預設路徑),當有靜態請求就往預設路徑獲取相應資源(迴圈遍歷預設路徑再拼接上資源名稱,獲取得到則返回Recource例項)。

1。1 當例項化resourceHandlerMapping時會執行下面addResourceHandlers函式

SpringBoot之靜態資源配置原理

1。2 向ResourceHandlerRegistry例項屬性locationValues賦值(為靜態資源的預設路徑)

SpringBoot之靜態資源配置原理

1。3 下圖為步驟1。2this。resourceProperties。getStaticLocations()的具體值(“classpath:/META-INF/resources/”, “classpath:/resources/”, “classpath:/static/”, “classpath:/public/” ),原始碼也說明了在預設路徑下的資源才會被解析到

SpringBoot之靜態資源配置原理

二 自主定義資源路徑

1 在application。properties檔案下配置上,SpringBoot2。5。4使用spring。resources。static-locations無效,當配置上自定義的路徑就會把原來的覆蓋掉了,原來的失效。

spring。web。resources。static-locations=classpath:/res/

2 使用自定義路徑原有配置失效,在原始碼中的體現如下。

例項化WebProperties後,在執行初始化函式initializeBean時,內部執行applyBeanPostProcessorsBeforeInitialization,呼叫後置處理器ConfigurationPropertiesBindingPostProcessor例項函式postProcessBeforeInitialization,使用反射呼叫WebProperties例項中函式public void setStaticLocations(String[] staticLocations)覆蓋原值。原始碼如下圖

SpringBoot之靜態資源配置原理

SpringBoot之靜態資源配置原理