「新特性」Spring Boot 全局懶載入機制瞭解一下

来源:https://www.cnblogs.com/leng-leng/archive/2020/07/16/13320624.html
-Advertisement-
Play Games

關於延遲載入 在 Spring 中,預設情況下所有定的 bean 及其依賴項目都是在應用啟動時創建容器上下文是被初始化的。測試代碼如下: @Slf4j @Configuration public class DemoConfig { public DemoConfig() { log.warn(" ...


關於延遲載入

在 Spring 中,預設情況下所有定的 bean 及其依賴項目都是在應用啟動時創建容器上下文是被初始化的。測試代碼如下:

@Slf4j
@Configuration
public class DemoConfig {
    public DemoConfig() {
        log.warn(" > > > demoConfig 被初始化 > > >");
    }
}

啟動應用日誌:

[           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
[           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1193 ms
[           main] c.p.c.global.lazy.config.DemoConfig      :  > > > demoConfig 被初始化 > > >
[           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
[           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''

如上日誌: 在 Tomcat started 之前 DemoConfig bean 已經被初始化創建。

一般情況程式在啟動時時有大量的 Bean 需要初始化,例如 數據源初始化、緩存初始化等導致應用程式啟動非常的慢。在 spring boot 2.2 之前的版本,我們對這些 bean 使用手動增加 @Lazy 註解,來實現啟動時不初始化,業務程式在調用需要時再去初始化,如上代碼修改為即可:

@Lazy
@Configuration
public class DemoConfig {}

為什麼需要全局懶載入

同上文中提到我們需要手動在 bean 增加 @Lazy 註解,這就意味著我們僅能對程式中自行實現的 bean 進行添加。但是現在 spring boot 應用中引入了很多第三方 starter ,比如 druid-spring-boot-starter 數據源註入、spring-boot-starter-data-redis 緩存等預設情況下, 引入即註入了相關 bean 我們無法去修改添加 @Lazy

  • spring boot 2.2 新增全局懶載入屬性,開啟後全局 bean 被設置為懶載入,需要時再去創建
spring:
  main:
    lazy-initialization: true  #預設false 關閉
  • 個別 bean 可以通過設置 @Lazy(false) 排除,設置為啟動時載入
@Lazy(false)
@Configuration
public class DemoConfig {}
  • 當然也可以指定規則實現 LazyInitializationExcludeFilter 規則實現排除
@Bean
 LazyInitializationExcludeFilter integrationLazyInitExcludeFilter() {
    return LazyInitializationExcludeFilter.forBeanTypes(DemoConfig.class);
}

全局懶載入的問題

通過設置全局懶載入,我們可以減少啟動時的創建任務從而大幅度的縮減應用的啟動時間。但全局懶載入的缺點可以歸納為以下兩點:

  • Http 請求處理時間變長。 這裡準確的來說是第一次 http 請求處理的時間變長,之後的請求不受影響(說到這裡自然而然的會聯繫到 spring cloud 啟動後的第一次調用超時的問題)。

  • 錯誤不會在應用啟動時拋出,不利於早發現、早解決、早下班。

總結

項目推薦: Spring Cloud 、Spring Security OAuth2的RBAC許可權管理系統 歡迎關註


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 移動WEB開發的rem佈局 目標(目錄) 能夠使用rem單位 能夠使用媒體查詢的基本語法 能夠使用Less的基本語法 能夠使用Less中的嵌套 能夠使用Less中的運算 能夠使用2種rem適配方案 思考:1、頁面佈局文字能夠隨著屏幕大小的變化而變化? 2、流式佈局和flex佈局主要針對於寬度佈局,那 ...
  • layui table有多行數據,通過外部輸入內容,需要定位到指定行,選中改行,對改行進行操作。 實現效果: HTML代碼: 1 <body> 2 <div class="layui-fluid"> 3 <input type="text" id="txt_id" /> 4 <table class ...
  • 價格便宜50-100 有圖的(仿站無需圖) 包動畫效果 也可以包介面對接 太複雜的頁麵價格另算 有意加qq896705559 另出體溫單源碼 http://106.12.212.110:8077/#/ 線上地址 包括折線圖 虛線實線 下垂線 陰影區域等 自定義每日時間 按照醫院標準編寫 ...
  • 在“JavaScript圖形實例:曲線方程”一文中,我們給出了15個曲線方程繪製圖形的實例。這些曲線都是根據其曲線方程,在[0,2π]區間取一系列角度值,根據給定角度值計算對應的各點坐標,然後在計算出的坐標位置描點,從而繪製出曲線。 我們可以將曲線的繪製過程動態展示出來。 例如,對於星形線的繪製,編 ...
  • 許可權管理系統中,菜單也屬於許可權控制的一個資源,應該直接應用於角色,和許可權功能點一樣,屬於角色控制的一環。不同角色用戶,登錄系統後,出現的系統菜單是不同的。在VUE+Element 前端中,我們菜單結合路由集合,實現可訪問路由的過濾,也就實現了對應角色菜單的展示和可訪問路由的控制,詳細可以參考隨筆《循... ...
  • 2020 年真的是災禍頻發,但是在各類前端框架上,依舊是在穩步的推進。近日 Vue 團隊更新了關於 Vue 3 的最新狀態,尤大新增了三個語法糖特性,它們將用於優化 SFC 的開發體驗,你會有興趣嘗鮮試試麽~ 登高遠眺 天高地迥,覺宇宙之無窮 前端框架 Vue 3: 2020 年中的狀態更新 近日 ...
  • 橋接模式的概念與實現 為什麼叫橋接模式 橋接模式的適用場景 繼承是面向對象的三大特性之一,但很多時候使用繼承的結果卻不盡如人意。除了人盡皆知的緊耦合問題外,有的時候還會導致子類的快速膨脹。 設想這樣一個場景:最初設計的時候有一個類型Product,但後來隨著新需求的出現,X原因導致了它的變化,X有兩 ...
  • 本專欄內容均引用《大話設計模式》並做適當修改, 起因 有部分電腦專業的學生或有一定經驗的在職開發者,他們都知道類、方法、構造方法、甚至抽象類、介面等概念,並用各種IDE寫過不少的Windows或Web程式,但是當問到為什麼要用面向對象,它的好處在哪裡,卻沒有人能完整的講出來,多數人的反應是,概念知 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...